回收视图的利用
系统要绘制ListView,他首先用getCount()函数得到要绘制的这个列表的长度,然后开始绘制第一行,调用getView()函数,在这个函数里面首先获得一个View(这个看实际情况,如果是一个简单的显示则是View,如果是一个自定义的里面包含很多控件的时候它其实是一个ViewGroup),然后再实例化并设置各个组件及其数据内容并显示它。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止
如果我们的listview中item项较多时,为了节省内存,需要用到回收视图contentview,下面贴一个经典的图:
下面简单说下上图的原理:
1.如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目存在内存中,其他的在Recycler中
2.ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的
3.当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图
ViewHolder Tag 不用每次去findView
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
ViewHold viewHold = new ViewHold();
convertView = LayoutInflater.from(context).inflate(
R.layout.weather_list_item, null);
viewHold.f_date = (TextView)convertView.findViewById(R.id.f_date);
viewHold.f_week = (TextView)convertView.findViewById(R.id.f_week);
convertView.setTag(viewHold);
}
ViewHold viewHold = (ViewHold)convertView.getTag();
return convertView;
}
class ViewHold {
TextView f_date;
TextView f_week;
}
待续。。。