今天在做项目的时候,有用到ListView,每一个item包含了太多的组件,一旦数据过多,刷新加载的时候就出现卡顿的情况,继而想到了ListView的优化,可又不会。只能去百度了,看了太多的资料,决定自己学一份,加深印象。努力学习,天天向上。
参考文章:http://blog.csdn.net/long704480904/article/details/8144939
http://mzh3344258.blog.51cto.com/1823534/889879
http://www.cnblogs.com/xilinch/archive/2012/11/08/2760233.html
http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html
http://www.cnblogs.com/over140/archive/2011/04/06/2006615.html
ListView的工作原理:
ListView针对每个Item,要求adapter 返回一个视图(GetView),也就是在开始绘制的时候,系统首先调用getCount()函数,根据它的返回值得到listview的长度,调用getView()一行一行的绘制Listvie的每一项。如果你的getCount()返回的是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行。如果我们有几千几万甚至更多的item要显示怎么办?为每个Item创建一个新的View?不可能!!!实际上Android早已经缓存了这些视图。
下面简单说下上图的原理:
- 如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目存在内存(内存内存哦,说的优化就是说在内存中的优化!!!)中,其他的在Recycler中
- ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的
- 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);
holder.text1 = (TextView) convertView.findViewById(R.id.text1);
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
holder.icon1.setImageResource(R.drawable.icon);
holder.text1.setText(mData[position]);
return holder;
TextView text1;
ImageView icon1;