ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来。
一. ListView 使用方法
ListView listview = new ListView(this);
//让listview和ArrayAdapter进行绑定。ListView一般都需要显示数据。listview会把ArrayAdapter里边的数据显示出来。
//AarryAdapter是由3个参数进行构造的。第一个参数,是context,即上下文的引用;第二个参数是一个在R文件中定义的Layout,只不过这里用的是系统的R文件;
//第三个参数是一个数组,
//android.R.layout.simple_list_itme_1表示listview中的每一项都只有一个TextView
listview.setAdapter(new ArrayAdapter<String> (this, android.R.layout.simple_list_itme_1, data):
setContentView(listview);
二.一般而言,一个ListView由以下三个元素组成:
1.View:用于展示列表,通常是一个xml所指定的。android的界面基本上都是由xml文件负责完成,所以ListView界面也是由XML定义。例如在ListView中经常用到的“android.R.layout_simple_list_item_1”等,就是Android系统内部定义好的一个xml文件。
2.适配器: 用来将不同的数据映射到View上,不同的数据对应不同的适配器,如ArrayAdapter,CursorAdapter,SimpleAdapter等,它们能够将数组,指针指向的数据(Map)等数据映射到View上。经过适配器处理后,在view看来所有的数据映射过来都是一样的。
3.数据: 具体的被映射到数据和资源,可以说字符串,图片等。通过适配器,这些数据将会被显示到ListView上,所有的数据和资源要显示到ListView上都通过适配器来完成。 系统已有的适配器可以将基本的数据显示到ListView上,如:数组,Cursor指向的数据,Map里的数据。
要实现复杂的ListView可以通过继承ListView并重写相应的方法完成,另外也可以通过继承BaseAdapter来实现。
ArrayAdapter,CuisorAdapter,SimpleAdapter都继承于BaseAdapter,所以通过继承BaseAdapter就可以完成自己的Adapter,可以将任何复杂组合的数据和资源,想要显示的效果展示给大家。
继承BaseApater之后,需要重写以下四个方法:
a)getCount
b)getItem
c)getItemId
d)getView。
三. ListView绘制过程如下:
a)首先,系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。 然后每绘制一个Item就会调用一次 getView方法。在此方法内就可以引用事先定义好的xml来确定显示的效果,并返回一个View对象作为一个Item显示出来。
b)做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。
系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。
但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了。
现在让我们回过头从新审视这个过程。
系统要绘制ListView了,
首先获得要绘制的这个列表的长度,然后开始绘制第一行。怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。
在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。