Android列表控件ListView详解
ListView绝对可以称得上是Android中最常⽤的控件之⼀,⼏乎所有应⽤程序都会⽤到它。
由于⼿机屏幕空间都⽐较有限,能够⼀次性在屏幕上显⽰的内容并不多,当我们的程序中有⼤量的数据需要展⽰的时候,就可以借助ListView来实现。----------------------------------------------ListView简易⽤法------------------------------------------------------
创建⼀个ListViewTest项⽬,让Android Studio⾃动创建好活动。
然后修改l中的代码,如下:
引⼊了ListView后,即使你的ListView没有内容,可视化编辑器preview仍然会这样显⽰:
android layout布局接下来修改MainActivity中的代码,如下所⽰:
直接在MainActivity中定义字符串数组虽然可以达到⽬的,但是不便于管理。
可以在res⽬录下的values⽂件夹下新建⼀个l⽂件,内容如下:
通过Resources对象获得l的内容:
最终结果如下:
-----------------------------------------------------适配器的介绍------------------------------------------------------
既然ListView是⽤于展⽰⼤量数据的,这些数据可以是从⽹上下载的,也可以是从数据库中读取的,应该视具体的应⽤场景来决定。数组中的数据是⽆法直接传递给ListView的,还需要借助适配器来完成。
Android中提供了很多的适配器的实现类,其中最简单的就是ArrayAdapter(注意不是SimpleAdapter)。
它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传⼊即可。
ArrayAdapter有多个构造函数的重载,根据需要选择最合适的⼀种。这⾥我简单介绍其中的⼀种:
new ArrayAdapter<>( Context context , @LayoutRes int resource , String[] objects );
Context:context表⽰上下⽂对象,参数:MainActivity.this
@LayoutRes:resource表⽰ListView⼦项布局的id,参数:android.R.layout.simple_list_item_1
(android.R.layout.simple_list_item_1这是Android 内置的布局⽂件,⾥⾯只有⼀个TextView ,可⽤于简单显⽰⼀段⽂本)
List<String> | String[]:objects 中指定要适配的数据。
适配器构建好之后,还需要调⽤ListView 的setAdapter()⽅法,将构建好的适配器对象传递进去,这样ListView 和数据之间的关联就建⽴完成了。
--------------------------------------------定制ListView------------------------------------------------------
只能显⽰⼀段⽂本的ListView 实在是太单调了,我们现在就来对ListView 的界⾯进⾏定制,让它可以显⽰更加丰富的内容。效果预览:
素材:
⾸先定义⼀个实体类,作为ListView 适配器的适配类型。新建类Browser ,代码如下:
为了尽量简单,Browser 类中只有两个字段,name 表⽰浏览器的名字,icon 对应浏览器的图标。
然后需要为ListView 的⼦项指定⼀个⾃定义的布局,在layout ⽬录下新建l ,代码如下:
在这个布局中,我们定义了⼀个ImageView⽤于显⽰浏览器图标,⼜定义了⼀个TextView⽤于显⽰浏览器的名称。
为了简洁,我在ImageView和TextView没有引⼊内容。其实引⼊内容并不会对结果造成影响,⽽且可以在preview中预览,以便调整布局。
接下来需要创建⼀个⾃定义的适配器,这个适配器继承⾃ArrayAdapter,并将泛型指定为Browser类。
新建类BrowserAdapter,代码如下:
BrowserAdapter重写了⽗类的⼀组构造函数,⽤于将上下⽂、ListView⼦项布局的id和数据都传递进来。另外⼜重写了getView()⽅法,这个⽅法在每个⼦项被滚动到屏幕内的时候会被调⽤。
在getView⽅法中,⾸先通过getItem()⽅法得到当前项的Browser实例,然后使⽤LayoutInflater来为这个
⼦项加载我们传⼊的布局,接着调⽤View的findViewById()⽅法分别获取到ImageView和TextView的实例,并分别调⽤它们的setImageResource()和setText()⽅法来设置显⽰的图⽚和⽂字,最后将布局返回,⾃定义适配器就完成了。
下⾯修改MainActivity中的代码,如下所⽰:
虽然⽬前我们定制的界⾯还是很简单,但是如果你领悟到了诀窍,只要修改l中的内容,就可以定制出各种复杂的界⾯了。
--------------------------------------------提升ListView的运⾏效率----------------------------------------------
之所以说ListView这个控件很难⽤,就是因为它有很多的细节可以优化,其中运⾏效率就是很重要的⼀点。
⽬前我们的ListView运⾏效率是很低的,因为在BrowserAdapter的getView()⽅法中每次都将布局重新加载了⼀遍,当ListView快速滚动的时候这就会成为性能的瓶颈。
getView()中还有⼀个convertView参数,这个参数⽤于将之前加载好的布局进⾏缓存,以便之后可以进⾏重⽤。
修改BrowserAdapter中的setView()代码,如下所⽰:
现在我们在getView()⽅法中进⾏了判断,如果convertView为空,则使⽤LayoutInflater去加载布局,如果不为空则直接对convertView进⾏重⽤。这样就⼤⼤提⾼了ListView的运⾏效率,在快速滚动的时候可以表现出更好的性能。
不过,虽然现在已经不会再去重复加载布局,但是每次在getView()⽅法中还是会调⽤View的findViewById()⽅法来获取⼀次控件的实例。
我们可以借助⼀个ViewHolder内部类来对这部分性能进⾏优化,修改BrowserAdapter中的setView()⽅法,如下所⽰:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论