1. 前言
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
列表的显示需要三个元素:
1.ListVeiw:用来展示列表的View。
2.适配器:用来把数据映射到ListView上的中介。
3.数据:被映射的字符串,图片,或者基本组件。
2.listView的使用
listView的布局上比较简单,只需要在其布局文件中写上如下代码即可:
这样就创建了一个空的列表,然后在.java文件中再填充数据,所以id是一定要设的。其中我提前设置了长按和单击属性为true,防止后续长按时事件和单击事件冲突。
在.java文件中获得这个ListView之后,使用Adapter为这个ListView填充数据,常用的Adapter有ArrayAdapter、SimpleAdapter
。随着ListView
中内容的丰富,以上两种Adapter已经很难满足需要,因此现在一般使用自定义的Adapter来填充数据。暂且先介绍ArrayAdapter和SimpleAdapter,后面有时间再来写自定义Adapter。
ArrayAdapter
最简单的Adapter,创建ArrayAdapter时需指定如下三个参数:
Context:这个参数无须多说,它代表了访问整个Android应用的接口。几乎创建所有组件都需要传入Context对象。
textViewResourceId:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。
数组或List:该数组或List将负责为多个列表项提供数据。
示例:
在创建完ArrayAdapter之后,调用ListView的setAdapter方法即可将数据填充到ListView中。
这里有一点要特别注意的是textViewResourceId是一个layout,在这个layout中只能有一个TextView,其它任何组件都不能有,包括LinearLayout等布局组件,
否则会报错。
SimpleAdapter
由于ArrayAdapter只能显示文字,功能实在有限,如果需要多填充一些内容的话指望不上,这时候可以使用SimpleAdapter。
SimpleAdapter相比ArrayAdapter强大很多,创建SimpleAdapter需要5个参数,第一个参数依然是Context,就不多说了,下面介绍余下的4个参数:
第2个参数:该参数应该是一个List Extends Map>类型的集合对象,该集合中每个Map对象生成一个列表项。
第3个参数:该参数指定一个界面布局的ID。该界面布局指定每一个列表项的样式。
第4个参数:该参数应该是一个String[]类型的参数,该参数决定提取Map对象中哪些key对应的value来生成列表项。
第5个参数:该参数应该是一个int[]类型的参数,该参数决定填充哪些组件。
示例:
final List
R.layout.item文件的主要布局如下:
可以看到,每个item中有一个图片image和文字name,这个layout用于规定ListView中每一个列表项的样式。SimpleAdapter中的第四个参数String数组与map的两个key对应,第五个参数int数组与这个layout中两个控件的id相对应,注意String[]数组与int[]数组中的值要一一对应,在这个示例中,key为name的value填充到id为name的TextView中。效果如下图所示:
3. ListView列表项的单击和长按
方法原型如下:
注意,长按事件有返回值。并且在两个方法的参数中都有int i, long l这两个参数,i指的是这一项在列表中的位置,l指的是这一项的id,在ArrayAdapter和SimpleAdapter中,i和l是相等的,在另一种Adapter——CursorAdapter中,l指的是从数据库中取出的数据在数据库中的id值。
4. ListView数据更新
直观地想,要实现数据更新,只要更新List,重新创建一个SimpleAdapter就可以了,这样会比较麻烦,SimpleAdapter有一个notifyDataSetChanged()方法,当之前创建该SimpleAdapter的List发生改变时,调用该方法就可以刷新列表了。要特别注意的一点是,List不能指向新的内存地址,即不能list = new ArrayList<>();这样是不起作用的,只能调用它的remove(),add()等方法来改变数据集。