RecyclerView複用ViewHolder機制(簡單瞭解)
阿新 • • 發佈:2019-01-07
本文特別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, intposition) { ((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的快取。