android的listview优化方案,Android - ListView的优化

ListView在应用中使用极为广泛,为了使ListView的滑动流畅,性能优化是必不可少的操作。在此提出三点优化方案。

优化的主要操作,其实是在Adapter中进行优化。首先看看最常规的写法,代码如下:

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view = getLayoutInflater().inflate(R.layout.item_layout,null);

TextView text = view.findViewById(R.id.text);

text.setText(data.get(position).toString);

return view;

}

这是最常规的写法,获取到Item的view,并获取到view中的控件TextView,将其赋值,并返回view。

那么问题来了,如果item条目非常多,成百上千条,那么就得获取成百上千次view,和成百上千次TextView。这样做显然是无用功,严重消耗内存。优化方案如下:

1. 重复使用Item布局

在getView方法中,第二个参数convertView,其实就是指item的view。所以我们并不需要为每个item都创建一个view,重复使用这个convertView就行了。优化代码如下:

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view;

if (convertView == null ){

view = getLayoutInflater().inflate(R.layout.item_layout,null);

} else {

view = convertView;//直接复用convertView

}

TextView text = view.findViewById(R.id.text);

text.setText(data.get(position).toString);

return view;

}

2. 重复使用Item 布局中的控件

在方案1中,虽然避免了重复创建了View,但仍然是重复的获取TextView,即重复调用findViewById的方法。其实每个Item的TextView也是相同的,所以我们也需要想办法将它复用,于是便有了ViewHolder这个玩意。优化代码如下:

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view;

ViewHolder holder;

if (convertView == null ){

view = getLayoutInflater().inflate(R.layout.item_layout,null);

holder = new ViewHolder;

holder.textView = view.findViewById(R.id.text);

view.setTag(holder);//将holder和view绑定

} else {

view = convertView;//直接复用convertView

holder = view.getTag;//取出holder,达到复用TextView的效果

}

holder.text.setText(data.get(position).toString);

return view;

}

class ViewHolder{

TextView textView;

}

3. ListView 分页加载。

当需要显示的数据条目非常多时,我们如果将其全部获取并显示,不仅耗时,而且整个list会特别长,此时肯定会造成ListView的滑动卡顿,这样设计肯定是不合理的,我们可以使用分页加载的方式,只加载部分数据,当用户滑到最后一项时,继续加载下一页数据,这样就会轻快很多。具体的代码实现: