Android - ListView的优化

2018-12-07  本文已影响0人  xlq

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

上一篇下一篇

猜你喜欢

热点阅读