在Android中列表页面主要使用ListView来进行展示实现
其大致流程如下:
第一步,在主布局xml文件中定义一个ListView组件,MainActivity中获取该主要组件;
第二步,定义我么的展示控制器继承BaseAdapter抽象类,并实现里面主要方法;
第三部,通过ListView.setAdapter(? extends Adapter) 来展示列表数据;
Android中有已经写好继承BaseAdapter的类如 Arraydapter、SimpleAdapter等。。。
Demo1:创建一个MyListAdapter 继承BaseAdapter 复写其getCoun()、getView(int position, View convertView, ViewGroup parent)方法,展示一个只有TextView的列表:
主类如下:
package com.example.listdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView)findViewById(R.id.lv_list);
lv.setAdapter(new MyListAdapter());
}
private class MyListAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return 10000;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = null;
if(convertView == null){
System.out.println("创建新的 item--"+position);
textView = new TextView(MainActivity.this);
}else{
System.out.println("复用缓存的 item--"+position);
textView = (TextView) convertView;
}
textView.setText("item--"+position);
textView.setPadding(0, 5, 0, 5);
return textView;
}
}
}
布局文件如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fastScrollEnabled="true" >
</ListView>
</RelativeLayout>
Demo2:使用三种不同的打气筒实现方式实现 复杂列表项效果,代码如下:
package com.xiaohui.listdemo2;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView)findViewById(R.id.lv_list);
lv.setAdapter(new MyAdapter());
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return 16;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
//第一种获取打气筒服务
// view = View.inflate(MainActivity.this, R.layout.item, null);
//第二种获取打气筒服务方式
// view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
//第三种获取打气筒
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.item, null);
}else{
view = convertView;
}
return view;
}
}
}
主布局文件同Demo1中所示,item布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/im_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/im_icon"
android:ellipsize="end"
android:singleLine="true"
android:textColor="#000000"
android:text="这是标题这是标题这是标题这是标题这是标题这是标题这是标题这是标题这是标题这是标题这是标题"
android:textSize="14sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title"
android:layout_toRightOf="@id/im_icon"
android:ellipsize="end"
android:singleLine="true"
android:textSize="12sp"
android:text="这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容"
android:textColor="#666666" />
</RelativeLayout>
运行效果如下:
Demo3: 使用ArrayAdapter实现简单列表展示。
package com.xiaohui.arrayadapter;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView list = (ListView)findViewById(R.id.lv_list);
String[] objetcs = new String[]{"亚瑟","诸葛亮","老夫子","亚瑟","诸葛亮","老夫子","亚瑟","诸葛亮","老夫子"};
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item,objetcs );
list.setAdapter(arrayAdapter);
}
}
布局XML如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
R.layout.item:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</TextView>
Demo4 使用SimpleAdapter 实现列表展示:
package com.xiaohui.simpleadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.lv_list);
List<Map<String, String>> data = new ArrayList<Map<String,String>>();
Map<String, String> map = new HashMap<String, String>();
map.put("name", "鲁班七号");
map.put("msg", "相信科学");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("name", "亚瑟");
map2.put("msg", "我的服装是最流行的装备");
Map<String, String> map3 = new HashMap<String, String>();
map3.put("name", "妲己");
map3.put("msg", "主人,受伤了吗");
data.add(map);
data.add(map2);
data.add(map3);
SimpleAdapter simpleAdapter = new SimpleAdapter(getApplicationContext(), data , R.layout.item, new String[]{"name","msg"}, new int[]{R.id.tv_name,R.id.tv_msg});
listView.setAdapter(simpleAdapter);
}
}
R.layout.item:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:id="@+id/tv_name"
android:layout_weight="1"
android:text="111"
android:textSize="20sp"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="0dp"
android:id="@+id/tv_msg"
android:layout_weight="1"
android:textSize="20sp"
android:text="2"
android:layout_height="wrap_content"
/>
</LinearLayout>
效果如下:
Demo5:将数据库中的数据展示在列表中:
实体类如下:
package com.xiaohui.createdb;
public class Person {
private String _id;
private String name;
private String phone;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Person(String name, String phone) {
super();
this.name = name;
this.phone = phone;
}
}
数据库管理类如下:
package com.xiaohui.createdb;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {
super(context,"xiaohui2.db", null, 1);
}
/**
* 当第一次创建表的时候执行
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(_id integer primary key autoincrement,name varchar(20),phone varchar(12))";
db.execSQL(sql);
}
/**
* 当数据库版本升级的时候调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
// System.out.println("onUpgrade。。。");
// String sql = "alter table user add phone varchar(20)";
// db.execSQL(sql );
}
}
MainActivity 如下:
package com.xiaohui.createdb;
import java.util.ArrayList;
import java.util.List;
import com.xiaohui.readFromDb.R;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myOpenHelper = new MyOpenHelper(getApplicationContext());
listView = (ListView)findViewById(R.id.lv_list);
}
public void insert(View v){
SQLiteDatabase wdb = myOpenHelper.getWritableDatabase();
EditText etName = (EditText)findViewById(R.id.et_name);
EditText etPhone = (EditText)findViewById(R.id.et_phone);
// wdb.execSQL("insert into user(name,phone) values(?,?)", new Object[]{etName.getText().toString(),etPhone.getText().toString()});
ContentValues values = new ContentValues();
values.put("name", etName.getText().toString());
values.put("phone", etPhone.getText().toString());
long insert = wdb.insert("user", null, values );
wdb.close();
if(insert>0){
Toast.makeText(getApplicationContext(), "新增成功", 1).show();
}else{
Toast.makeText(getApplicationContext(), "新增失败", 1).show();
}
}
public void delete(View v){
SQLiteDatabase wdb = myOpenHelper.getWritableDatabase();
EditText etName = (EditText)findViewById(R.id.et_name);
// wdb.execSQL("delete from user where name=?", new Object[]{etName.getText().toString()});
int delete = wdb.delete("user", "name=?", new String[]{etName.getText().toString()});
wdb.close();
Toast.makeText(getApplicationContext(), "删除了"+delete+"条", 1).show();
}
public void update(View v){
SQLiteDatabase wdb = myOpenHelper.getWritableDatabase();
EditText etName = (EditText)findViewById(R.id.et_name);
EditText etPhone = (EditText)findViewById(R.id.et_phone);
// wdb.execSQL("update user set phone=? where name=?", new Object[]{etPhone.getText().toString(),etName.getText().toString()});
ContentValues values = new ContentValues();
values.put("phone", etPhone.getText().toString());
int update = wdb.update("user", values , "name=?", new String[]{etName.getText().toString()});
wdb.close();
Toast.makeText(getApplicationContext(), "修改了"+update+"条", 1).show();
}
public void select(View v){
SQLiteDatabase wdb = myOpenHelper.getWritableDatabase();
// Cursor cursor = wdb.rawQuery("select * from user", null);
Cursor cursor = wdb.query("user", null,null, null, null, null, null);
List<Person> list = new ArrayList<Person>();
if(cursor != null && cursor.getCount() > 0){
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
Person person = new Person(name, phone);
list.add(person);
}
}
listView.setAdapter(new myAdapter(list));
}
private class myAdapter extends BaseAdapter{
private List<Person> list = new ArrayList<Person>();
public myAdapter(List<Person> list) {
super();
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View item ;
if(convertView == null ){
item = View.inflate(getApplicationContext(), R.layout.item, null);
}else{
item = convertView;
}
Person person = list.get(position);
TextView name = (TextView)item.findViewById(R.id.item_name);
TextView phone = (TextView)item.findViewById(R.id.item_phone);
name.setText(person.getName());
phone.setText(person.getPhone());
return item;
}
}
}
activity_main.xml如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="name"
/>
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="phone"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="insert"
android:text="新增" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="delete"
android:text="删除" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="update"
android:text="修改" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="select"
android:text="查询" />
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
item.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:id="@+id/item_name"
android:layout_weight="1"
android:text="111"
android:textSize="20sp"
android:textColor="#000000"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="0dp"
android:id="@+id/item_phone"
android:textColor="#000000"
android:layout_weight="1"
android:textSize="20sp"
android:text="2"
android:layout_height="wrap_content"
/>
</LinearLayout>
运行效果如下: