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的滑动卡顿,这样设计肯定是不合理的,我们可以使用分页加载的方式,只加载部分数据,当用户滑到最后一项时,继续加载下一页数据,这样就会轻快很多。具体的代码实现: