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方法尽量少做耗时操作

原创粉丝点击