首先,ListView有两个主要的职责:
- 将数据填充到布局
- 处理用户的点击选择事件
其次,一个ListView至少要有三个元素:
- ListView中每一条目就是一个视图对象(View)
- 填充在每一个条目中的数据或者图片等
- 连接数据与ListView的适配器
Android AdapterView常用适配器
Adapter 含义
ArrayAdapter<T> |
用来绑定一个数组,支撑泛型操纵 |
SimpleAdapter |
将静态的map类型数据和xml定义的布局控件对应起来 |
SimpleCursorAdapter |
绑定从数据库获得的游标数据 |
BaseAdapter |
通用的基础适配器,可以在ListView和Sipnner中使用 |
ArrayAdapter
实现简单的ListView数据绑定。默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。
- 首先在布局文件中添加一个ListView控件
- 在Activity的代码中声明和初始化该控件
- 定义一组数据来存放要在ListView中显示的内容
- 新建一个ArrayAdapter适配器,一般使用以下构造函数。三个参数分别是:上下文对象,包含textView的布局文件,字符串数组。要注意的是,第二个参数所代表的该布局文件必须包含有一个TextView。
public
ArrayAdapter
(Context context, int textViewResourceId, T[] objects)
- 通过setAdapter方法为ListView绑定该监听器
此外,可以通过Android系统内置的布局文件,实现带选择框的ListView:
- 在新建ArrayAdapter时引入系统的局部文件对象,比如android.R.layout.simple_list_item_checked
- 通过setChoiceMode方法设定选择的模式,如多选(ListView.CHOICE_MODE_MULTIPLE)
android.R.layout.simple_list_item_checked实现的效果如下图所示:
另外,还有
android.R.layout.simple_list_item_multiple_choice实现带CheckBox的ListView
android.R.layout.simple_list_item_single_choice实现带RadioButton的ListView
通过以上方法,我们定义并且实现了带数据的ListView。但这还是第一步,除了对ListView的实现之外,我们还应该对用户的点选事件进行监听,通过ListView.setOnItemClickListener方法,具体的参考API文档。
ListView.setOnItemClickListener(new OnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) { }
});
SimpleAdapter
SimpleAdapter的功能更为强大,可以实现ListView中Item的内容有文字、图片、多选框等
- 在XML文件中定义ListView每一行条目(Item)所要实现的布局
- 在Activity代码中新建ArrayList,里面存放的是HashMap对象,将数据以键值对的形式存放在里面
- 新建SimpleAdapter对象,绑定监听器,步骤和上面的类似
SimpleCursorAdapter
An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file.
从数据库获取数据,通过返回的Cursor对象绑定到ListView中
主要不同是构造SimpleCursorAdapter的构造函数
public SimpleCursorAdapter(Context context, int layout,Cursor c, String[] from, int[] to)
弄懂了这个就可以了。
BaseAdapter
实现自定义的Adapter适配器。主要是要新建一个类,继承实现抽象类BaseAdapter。
其中,getView方法较难理解,系统在绘制列表的每一行时都将调用该方法。该方法有三个参数,Position表示显示的是第几行,covertView是指从布局文件中inflate来的布局。
我们将定义好的ListView布局文件提取成View实例用来显示,然后将xml文件中的各个组件实例化(findViewById方法)。这样便将数据对应到各个组件上了,如果为了响应点击事件,则需要添加监听器。
过程如下:
- 获得要绘制的列表的长度
- 调用getView方法,在这个方法中首先获得一个View(实际上是一个ViewGroup),然后再实例化和设置各个组件。
- 一行一行往下绘制,直到绘制完为止
public View getView (int position,View convertView, ViewGroup parent)
convertView找了资料说,相当于一个缓存,当条目不可见时,它就缓存了它的数据。以后,当条目再次出现时,只须更新数据就可以了,节约了系统的消耗。
无关的补充:
select 和 click 的区别:
select是一种状态,而click是一个动作。
用户一般都是先选择(select),在点击(click)。
当用户把光标移动的菜单选项上面时,就是选择。