RecyclerView复用ViewHolder机制(简单了解)

本文特别low


我设置item为200dp,打印20个,发现onCreateViewHolder仅仅执行了9次

int i = 0;

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.i(TAG, "onCreateViewHolder: " + ++i);
    return new ViewHolder(((Activity)parent.getContext()).getLayoutInflater().inflate(R.layout.item, parent, false));
}

一个屏幕1080dp,可以显示5个item,但是为什么要有9个item呢?


后来我把item设置成全屏的,发现onCreateViewHolder执行了5次。

所以RecyclerView除了屏幕里面的,在拖动的时候,还会额外执行4次。

所以得出结论:RecyclerView额外会创建4个ViewHolder,然后为了在上拉下拉的时候,就有了一个缓存。


然后还有一个onBindViewHolder。

继续200dp那个例子。

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    ((TextView)holder.itemView.findViewById(R.id.tv)).setText(i+"");
}

发现输出的是123456799999999。

但是拖动了一会,发现全变成999999999了。


这证明了啥?

在创建9个ViewHolder的同时,我们会执行一次onCreateViewHolder,再执行一次onBindViewHolder。

可是9个以后,就要复用ViewHolder了。

之前item为1的,2的,3的。。可能就会执行onBindViewholder,然后赋值为9了。


一点点原理

RecyclerView主要参与回收的类有,Recycler负责ViewHolder各种状态的管理,RecyclerViewPool负责ViewHolder的缓存。

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/80118127