ListView详解
来源:互联网 发布:魔力学堂源码 编辑:程序博客网 时间:2024/06/16 07:16
一、什么是ListView
ListView是一个可以将数据以动态滚动的方式展示给用户的一种View
二、ListView的适配器模式
ListView的优化主要集中在Adapter中的getView()方法中
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { inflater.inflate(R.layout.list_item_icon_text, null); holder = new ViewHolder(); holder.icon = (ImageView) convertView.findViewById(R.id.icon); holder.text = (TextView) convertView.findViewById(R.id.text); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.icon.setImageResource(R.drawable.icon); holder.text.setText(mData[position]); return convertView; } static class ViewHolder { ImageView icon; TextView text; }
三、ListView中的RecycleBin机制
RecycleBin机制,这个机制也是ListView能够实现成百上千条数据都不会OOM最重要的一个原因。其实RecycleBin的代码并不多,只有300行左右,它是写在AbsListView中的一个内部类,所以所有继承自AbsListView的子类,也就是ListView和GridView,都可以使用这个机制。
在某一时刻,我们看到ListView中有许多View呈现在UI上,这些View对我们来说是可见的,这些可见的View可以称作OnScreen的View,即在屏幕中能看到的View,也可以叫做ActiveView,因为它们是在UI上可操作的。
当触摸ListView并向上滑动时,ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范围,此时这些OnScreen的View就变得不可见了,不可见的View叫做OffScreen的View,即这些View已经不在屏幕可见范围内了,也可以叫做ScrapView,Scrap表示废弃的意思,ScrapView的意思是这些OffScreen的View不再处于可以交互的Active状态了。ListView会把那些ScrapView(即OffScreen的View)删除,这样就不用绘制这些本来就不可见的View了,同时,ListView会把这些删除的ScrapView放入到RecycleBin中存起来,就像把暂时无用的资源放到回收站一样。
当ListView的底部需要显示新的View的时候,会从RecycleBin中取出一个ScrapView,将其作为convertView参数传递给Adapter的getView方法,从而达到View复用的目的,这样就不必在Adapter的getView方法中执行LayoutInflater.inflate()方法了。
RecycleBin中有两个重要的View数组,分别是mActiveViews和mScrapViews。这两个数组中所存储的View都是用来复用的,只不过mActiveViews中存储的是OnScreen的View,这些View很有可能被直接复用;而mScrapViews中存储的是OffScreen的View,这些View主要是用来间接复用的。
四、ListView的优化
convertView的复用
viewholder优化
减少Item View的布局层级
adapter中的getView方法尽量少做耗时操作
- listview详解
- ListView 详解
- ListView详解
- ListView详解
- ListView详解
- ListView详解
- listView详解
- ListView详解
- ListView详解
- ListView详解
- Listview详解
- ListView详解
- ListView详解
- ListView 详解
- ListView 详解
- ListView详解
- ListView详解
- ListView详解
- 最大团模板
- F1解读
- UVa 12895
- JAVA中堆和栈的区别
- 替换桌面快捷方式图标
- ListView详解
- OPENCV 遍历文件夹中的图片方法
- Java多线程
- [Motion]MPU9250的基本框架
- C# 属性的代码生成失败。错误是无法将属性转换为InstanceDescriptor
- 快速入门微信硬件jsapi教程全集
- PCIE 设备扫描的过程
- java中stringBuilder的用法
- nodejs优缺点