本文特别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的缓存。