1.三种Adapter构建ListView
ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种
BaseAdapter: 定义一个类继承BaseAdapter, 重写4个抽象方法, ListView的条目是由getView()方法构建出来的
SimpleAdapter: 创建SimpleAdapter对象时, 传入数据(List<Map<String, ?>>), 并指定数据的绑定关系
SimpleCursorAdapter: 创建SimpleCursorAdapter对象时, 传入一个Cursor, 指定数据的绑定关系
2.监听ListView的点击
调用ListView.setOnItemClickListener(OnItemClickListener)方法注册一个监听器
在监听器的onItemClick()方法中使用 parent.getItemAtPosition(position) 方法可以获取指定条目上的数据
BaseAdapter:返回的就是自定义的getItem()方法中返回的数据
SimpleAdapter:返回的是一个Map, 就是创建SimpleAdapter时List中的一个Map
SimpleCursorAdapter:返回的是一个Cursor, 这个Cursor就是创建时传入的Cursor, 但是已经通过moveToPosition()方法指定到点击的索引了
一:BaseAdapter添加方式:
1.查询出要被添加的数据
2.获取ListView对象
3.创建一个类继承BaseAdapter,实现其中的方法
4.给ListView对象设置适配器personLV.setAdapter(new MyBaseAdapter());
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;
/**
* 注意:
* BaseAdapter生成的条目,进行Item点击事件监听的时候,
* parent.getItemAtPosition(position)返回的是person对象
* 因为调用的是生成条目对象MyBaseAdapter类中的getItem方法
*
*/
public class BaseAdapterActivity extends Activity {
private ListView personLV;
private List<Person> persons;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDao dao = new PersonDao(getApplicationContext());
persons = dao.queryAll();//查询数据
personLV = (ListView) findViewById(R.id.personLV);//获取ListView
personLV.setAdapter(new MyBaseAdapter());//给ListView添加适配器,按照adapter中的方法对ListView添加条目
personLV.setOnItemClickListener(new MyOnItemClickListener());//给条目添加条目点击监听器
}
/**
* 点击事件监听器
*/
private class MyOnItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Person p = (Person) parent.getItemAtPosition(position);//其实就是调用了MyBaseAdapter中的getItem方法,返回指定条目上的数据
Toast.makeText(getApplicationContext(), p.getId()+","+p.getName()+","+p.getBalance(), Toast.LENGTH_SHORT).show();
}
}
/**
* 将每个Person对象生成一个条目,将每个条目添加到ListView中
*/
private class MyBaseAdapter extends BaseAdapter {
public int getCount() {//返回ListView中要显示的条目数量(说白了就是,person集合元素的个数)
return persons.size();
}
public Object getItem(int position) {//返回指定位置上的对象
return persons.get(position);
}
public long getItemId(int position) {//返回条目的id,从0开始
return position;
}
//返回指定位置上的View,添加到ListView中,也就是说Person集合有几个元素就调用这个方法几次,一次生成一个条目
public View getView(int position, View convertView, ViewGroup parent) {//因为屏幕最多显示10个条目,上下移动的时候都是移动的时候创建的,而不是一次创建完的,convertView代表移出屏幕外的那个条目
Person person = persons.get(position);
/*
* inflate充气的意思,理解为构建一个条目
* 参数一:上下文环境
* 参数二:item的布局文件
* 参数三:将item挂到哪个组件上,如果写null,默认挂到ListView上
*/
/**
* 千万要注意:
* 此时SQLiteNewActivity类中使用findViewById并不能找到条目中的id,name,balance组件
* 因为此时还没加载到Activity中
* 所以需要靠item(条目)来获取条目里的组件
* item.findViewById
*
*/
View item = View.inflate(getApplicationContext(), R.layout.item, null);
TextView idTV = (TextView) item.findViewById(R.id.idTV);
TextView nameTV = (TextView) item.findViewById(R.id.nameTV);
TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV);
/**
* 千万要注意:
* setText(CharSequence text)
* setText(int resid)
* 这个方法有重载,如果传入int类型的值进去(比如person的id和balance)
* 程序会去找R文件中内部类string中的值,所以肯定找不到
* 因此setText的时候务必转成字符串
*/
idTV.setText(person.getId()+"");
nameTV.setText(person.getName());
balanceTV.setText(person.getBalance()+"");
return item;
}
}
}
二.SimpleAdapter添加方式:
1.查询出要被添加的数据
2.创建一个Map元素的List集合 List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
3.遍历需要被添加的数据,将数据以键值对的方式加入到map集合中,再将Map集合加入到List集合
4.获取ListView对象 ListView personLV = (ListView) findViewById(R.id.personLV);
5.给ListView设置适配器
personLV.setAdapter(new SimpleAdapter(this, data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
/* SimpleAdapter传入指定的数据和布局文件,以及匹配关系,自动生成View,装入LsitView
* 参数一:上下文环境
* 参数二:数据,List<Map<String,Object>>,每个Person的数据装入一个Map,将所有Map装入List
* 参数三:布局文件的资源id,因为每个条目也有自己的布局方式,这个布局指的是每个item的布局
* 参数四:Map中的key,和参数五中的id所对应的组件对应,将指定Key对应的Value,放入id对应的组件上
* 参数五:View中的id
*/
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.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;
/**
* 注意:
* SimpleAdapter生成的条目,进行Item点击事件监听的时候,
* parent.getItemAtPosition(position)返回的是map集合
*
*/
public class SimpleAdapterActivity extends Activity {
private ListView personLV;
private List<Person> persons;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDao dao = new PersonDao(getApplicationContext());
persons = dao.queryAll();//查询数据
personLV = (ListView) findViewById(R.id.personLV);//获取ListView
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
//把每个Person的数据装入一个map,再将所有map装入list
for (Person p : persons) {
Map<String,Object> map = new HashMap<String, Object>();
map.put("id", p.getId());
map.put("name", p.getName());
map.put("balance", p.getBalance());
data.add(map);
}
/*
* 参数一:上下文环境
* 参数二:遍历Person集合,将一个Person对象数据装入Map集合,再将所有Map集合装入List集合中
* 参数三:生成条目的布局文件
* 参数四:map中的key
* 参数五:条目中的组件id
* 参数四和参数五的意思是:
* 根据key去找map集合找到对应的value值,将value放到参数五中的组件中(先后顺序)
*/
personLV.setAdapter(new SimpleAdapter(getApplicationContext(), data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
personLV.setOnItemClickListener(new MyOnItemClickListener());//给条目添加条目点击监听器
}
/**
* 点击事件监听器
*/
private class MyOnItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Map<String,Object> map = (Map<String, Object>) parent.getItemAtPosition(position);//其实就是调用了MyBaseAdapter中的getItem方法,返回Map
Toast.makeText(getApplicationContext(), map.get("name").toString(), Toast.LENGTH_SHORT).show();
}
}
}
三:SimpleCursorAdapter
1.查询出要被添加的数据,返回的是一个Cursor类型对象
2.获取ListView对象
3.在ListView上设置适配器
注意:查询出来的主键必须以_id命名,最好就是数据库表中的主键列名就是_id,如果不能改变,就在查询的时候取别名。
dao层
/**
* 查询person表中所有记录,返回 Cursor类型
*/
public Cursor queryAllCursor(){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query("person", new String[]{"id _id ","name","balance"}, null, null, null, null, "id DESC");
return c;
}
Activity
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class SimpleCursorAdapterActivity extends Activity {
private ListView personLV;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDaoNew dao = new PersonDaoNew(getApplicationContext());
Cursor c = dao.queryAllCursor();
personLV = (ListView) findViewById(R.id.personLV);
personLV.setAdapter(new SimpleCursorAdapter(this, R.layout.item, c,//
new String[]{"_id","name","balance"}, //
new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));//
/*
*参数一:上下文环境
*参数二:布局文件资源ID
*参数三:包含数据的游标
*参数四:游标中的列名
*参数五:条目中的组件ID,游标中的数据就会放在这些组件上
*/
personLV.setOnItemClickListener(new MyOnItemClickListener());//添加监听器
}
//监听器的实现类
private class MyOnItemClickListener implements OnItemClickListener{
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Cursor c = (Cursor) parent.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), c.getString(0), Toast.LENGTH_SHORT).show();
}
}
}
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"
android:padding="10dp">
<TextView
android:id="@+id/idTV"
android:textSize="20sp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="1" />
<TextView
android:layout_weight="2"
android:id="@+id/nameTV"
android:layout_width="0dp"
android:textSize="20sp"
android:layout_height="wrap_content"
android:text="皮卡丘" />
<TextView
android:layout_weight="2"
android:id="@+id/balanceTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="1000"
android:textSize="20sp" />
</LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 这个是表头的设置,下面拖动,表头不会动 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:textSize="20sp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="序号" />
<TextView
android:layout_weight="2"
android:layout_width="0dp"
android:textSize="20sp"
android:layout_height="wrap_content"
android:text="姓名" />
<TextView
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="余额"
android:textSize="20sp" />
</LinearLayout>
<!-- 这个是表头的设置,下面拖动,表头不会动 -->
<ListView
android:id="@+id/personLV"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
四:ArrayAdapter
最简单的数据适配器
Activity
package com.xxc.day4;
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 array_lv = (ListView) findViewById(R.id.array_lv);
String[] objs = new String[]{"王立军1","王立军2","王立军3","王立军4","王立军5","王立军6"};
/**
* 参数一:上下文
* 参数二:资源文件,是一个TextView,由android自己定义的
* 参数三:要显示的数据
*/
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, objs);
array_lv.setAdapter(adapter);
}
}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/array_lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>