文章目录
  1. 1. 复用原理以及提升效率
    1. 1.1. 复用item
  2. 2. 提高ListView的效率
    1. 2.1. 最简单的使用ListView
    2. 2.2. 复用convertView
    3. 2.3. 使用ViewHolder

复用原理以及提升效率

复用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开发的技巧

文章目录
  1. 1. 复用原理以及提升效率
    1. 1.1. 复用item
  2. 2. 提高ListView的效率
    1. 2.1. 最简单的使用ListView
    2. 2.2. 复用convertView
    3. 2.3. 使用ViewHolder