1. 程式人生 > >RecyclerView複用ViewHolder機制(簡單瞭解)

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的快取。