美文网首页
Android - ListView的优化

Android - ListView的优化

作者: xlq | 来源:发表于2018-12-07 00:42 被阅读0次

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

    相关文章

      网友评论

          本文标题:Android - ListView的优化

          本文链接:https://www.haomeiwen.com/subject/laczcqtx.html