手写RecyclerView和RecylerView回收池-4

手写RecyclerView回收池

  • 回收池代码封装(RecyclerPool)
  • RecyclerPool的使用
  • 验证RecyclerPool复用

回收池代码封装(RecyclerPool)

public class Recyler {

    /**
     * 回收池的容器, 存储所有回收了的View
     *
     */
    private Stack[] views;

    public Recyler(int viewTypeCount){
        //根据类型的种类数量来创建数组
        views=new Stack[viewTypeCount];
        //初始化数组中的每一个Stack(  总体数据结构一个二维数组)
        for (int x=0;x();
        }

    }


    /**
     * 将View放入对应类型的Stack中
     * @param itemView
     * @param itemViewType
     */
    public void put(View itemView,int itemViewType){
        views[itemViewType].push(itemView);
    }


    public View get(int itemViewType){
        try {
            return views[itemViewType].pop();
        }catch (Exception e){
            return null;
        }
    }
}

RecyclerPool的使用

  • 初始化Recycler回收池
 public void setAdapter(MyBiliRecylerView.Adapter mAdapter) {
        this.mAdapter = mAdapter;
        //初始化回收池
        if(null!=mAdapter){
            recyler=new Recyler(mAdapter.getViewTypeCount());
            scrollY=0;
            firstRow=0;
            needRelayout=true;
            //重新测量,重新摆放
            requestLayout();
        }
    }
  • 从Recycler回收池获取View
 public View obtainView(int row, int width, int height) {

        //首先获取到这一行数的Item的布局类型
        int itemViewType = mAdapter.getItemViewType(row);
        //去栈中拿
        View view = recyler.get(itemViewType);
        //定义一个View(用于栈中拿不出来View的时候处理,需要自己生成View)
        View itemView = null;
        if (null == view) {
            itemView = mAdapter.onCreateViewHolder(row, itemView, this);
            if (null == itemView) {
                throw new RuntimeException("onCreateViewHolder 必须要填充布局");
            }
        } else {
            itemView = mAdapter.onBinderViewHolder(row, view, this);
        }
        //给每个ItemView设置一个Tag
        itemView.setTag(R.id.tag_type_view, itemViewType);
        //先测量去每一个ItemView
        itemView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
        //每生成一个ItemView都添加进入RecyclerView
        addView(itemView);
        return itemView;
    }
  • 把View放入Recycler回收池
    @Override
    public void removeView(View view) {
        super.removeView(view);
        int key=(int)view.getTag(R.id.tag_type_view);
        //将View添加进回收池中
        recyler.put(view,key);
    }

验证RecyclerPool复用

image.png

image.png

好了,我们关于RecyclerView的自定义就讲完了,谢谢大家,再见!

你可能感兴趣的:(手写RecyclerView和RecylerView回收池-4)