2024年3月13日发(作者:)

ListView的使用

简介

在Android开发中ListView是比较常用的组件。

以列表的形式展示具体内容。

并且能够根据数据的长度自适应显示。

列表的显示需要三个元素:

a. 将数据映射到ListView上的适配器。

b. 填入View上的的数据。

Adapter

• 适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的

AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设

置,使AdapterView与数据的绑定更加简便,修改更加方便。

提供哪些Adapter

ArrayAdapter

– 绑定一个数组,支持泛型操作。

SimpleAdapter

– 绑定在xml中定义的控件对应的数据。

SimpleCursorAdapter

– 绑定游标得到的数据。

BaseAdapter

– 通用的基础适配器。

何时使用BaseAdapter

• 在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的

操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要

来处理用户的操作,而是里面的控件要获得用户的焦点。用SimpleAdapter

添加一个按钮到ListView的条目中,会发现添加可以,但是却无法获得焦

点,点击操作被ListView的Item所覆盖。这时候最方便的方法就是使用灵

活的适配器BaseAdapter了。

Adapter的执行

在我们给ListView跟Adapter建立桥梁时,也就是调用setAdapter(函数;

在setAdapter(函数中

– 首先调用sterDataSetObserver(mDataSetObserver),

目的是为了清空之前绑定的mDataSetObserver对象。

接着调用nt(函数,目的是获取行数(显示多少行的个

数)。

– 接着调用erDataSetObserver(mDataSetObserver)函数,

其原理是采用观察者设计模式来实现,目的是对绑定Adapter的数

据进行监测,一旦数据有更新,就会做相应的处理(下面在详述)。

– 接着调用wTypeCount(函数,目的是获取样式的个数

(可以这么理解,通常ListView显示每一行的View都是一样的,是

因为该函数默认返回值是1,但有时需要显示的每行的View有不一

样的,就好比定制View一样,奇数行显示用户姓名,偶数行显示用

户照片,这时我们可以设置两种View来分别显示,怎么实现呢?我

们可以在自定义的Adapter里重写getViewTypeCount(函数,让其返

回2,具体实现可以参考下面的实例代码)。

– 接着调用wTypeCount(int viewTypeCount),其参数

viewTypeCount就是上面调用wTypeCount(返回的值。

该函数的作用是通过参数viewTypeCount的值,创建多少可复用

View的List对象,就是说,如果参数viewTypeCount是2的话,那

就创建2个ArrayList的对象。

– 最后通过调用requestLayout(函数。requestLayout(会向系统发一个

重新绘制布局的信号,目的是为了调用ure方法

(该函数的实现原理不再讨论范围之内,自己可以去了解一下)。

继上面流程,接下来,调用ure(函数。

– 首先判断Adapter是否为空,目的是为了调用nt(函

数,获取其行数。

– 接着调用View(函数,该函数的作用是绘制每一

行的View。

• 首先调用nsientStateView(int position)函数,

其目的是通过参数position的值来获取刚消失的View对象。

比如,一共20条记录,手机屏幕只能显示10条记录,当往

下滑动时,第11行记录显示,可第1行的记录就消失,该函

数就是获取到第1行的View对象。 * 调用

mId(position)函数,获取该position对应的

View的id。

• 接着调用w(函数,获取一行的View。这就是

我们在手机屏幕上看到的一行的样子。

– 接着调用apView(函数,将刚显示的View放进可

复用View的List集合里。

当我们数据有更新的时候,即调用notifyDataSetChanged(函数的时候。一

旦数据发生改变,在rDataSetObserver会做相应的处

理。我们在BaseAdapter抽象类也能看到有notifyDataSetChanged(函数,

其实现就一行代码,即Changed(;而在该