ListView、GridView、RecycleView性能优化小总结

RecycleView控件的出现是为了替代ListView和GridView控件的,号称,是他们的加强版,在性能上做了优化处理,这里总结一下优化的地方。

1,在以往使用ListView或者GridView的时候,如果要进行性能优化,基本上两个做法:

①定义内部类ViewHolder;

定义ViewHolder是为了减少findViewById的次数,如果每一次渲染布局都进行一轮的findViewById,明显重复了,所以性能较低。

②判断convertView,如果为null则进行布局渲染,否则直接重用上一次渲染的convertView。

渲染布局,本身是比较耗性能的,对于这种列表类的控件其实布局是相同的,不同的只是布局展示的内容,那么,都是长的一样的item布局,每次展示item的时候都重新进行item布局的渲染无疑严重增加了负荷,所以,其实我们只需要渲染一次,在以后重用这个渲染的布局,同时,给布局set不同的数据即可。

基于以上两点,RecycleView都做了优化,而且是强行优化,要想使用RecycleView就得按照它的这个优化的套路进行写代码。

先说结论

1,RecycleView内部自动进行了ViewHolder的优化操作,使用RecycleView必须进行ViewHolder的继承和重写;
2,代码实现了高内聚低耦合的风格
3,布局渲染的优化
4,瀑布流,横向纵向展示通过LayoutManager来控制,一行代码实现控制,一个LayoutManager实现了方向的高度的解耦

话不多说,上代码,分析代码;

import java.util.List;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {

    private List<String> list;

    public MyRecyclerAdapter(List<String> list) {
        // TODO Auto-generated constructor stub
        this.list = list;
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv;

        public MyViewHolder(View view) {
            super(view);
            tv = (TextView)view.findViewById(android.R.id.text1);
        }

    }

    @Override
    public int getItemCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        //绑定数据
        holder.tv.setText(list.get(position));

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
        // 创建ViewHolder
        MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null));
        return holder;
    }
}

分析;

1,在ViewHolder内部类中进行findViewById的优化;
2,在onCreateViewHolder()方法中进行布局的渲染优化;
3,在onBindViewHolder()方法中进行数据的绑定;

//recylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
//recylerview.setLayoutManager(new GridLayoutManager(this, 3));
//瀑布流效果
recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));

通过LayoutManager来设置方向,横向,纵向,数据的顺序翻转展示。

猜你喜欢

转载自blog.csdn.net/jakezhang1990/article/details/81487561