复用原理以及提升效率
复用item
ListView在加载数据的时候是会复用item的,即ListView是会缓存至少一屏幕的item.
如下图所示。

从图上可以看出当item1滚出屏幕,并且一个新的项目从屏幕底端上来时,ListView再请求一个视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。
提高ListView的效率
最简单的使用ListView
没有复用convertView,每次都要重新创建,效率极其低下
1 2 3 4 5 6 7 8
| public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context); convertView = layoutInflater.inflate(R.layout.listview_item, null); TextView textView = (TextView) (convertView).findViewById(R.id.textview); textView.setText(persons.get(position).getName()); return convertView; }
|
复用convertView
利用 convertView 回收视图, 效率提高 200%
1 2 3 4 5 6 7 8 9 10 11
| public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context); if (convertView == null) { convertView = layoutInflater.inflate(R.layout.listview_item, null); }
TextView textView = (TextView) (convertView).findViewById(R.id.textview); textView.setText(persons.get(position).getName()); return convertView; }
|
使用ViewHolder
使用ViewHolder模式效率再提高50%
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(context); convertView = layoutInflater.inflate(R.layout.listview_item, null); holder =new ViewHolder(); holder.textView = (TextView) (convertView).findViewById(R.id.textview); convertView.setTag(holder);
} else { holder = (ViewHolder) convertView.getTag();
} holder.textView.setText(persons.get(position).getName()); return convertView; }
class ViewHolder { private TextView textView; }
|
通过本篇博客应该明白了ListView是怎样复用,以及怎样提高ListView的工作效率了。
欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧
