ChildHelper類
這個類中有兩類方法:
- 第一類方法是許多和ViewGroup方法中重名的方法,例如getChildAt枚赡、getChildCount等等,這些方法內(nèi)部實現(xiàn)是不包括mHiddenViews的,舉個例子面殖,例如getChildCount方法:
return mCallback.getChildCount() - mHiddenViews.size();
履澳;如果想直接訪問ViewGroup中的方法嘶窄,可以調(diào)用***Unfiltered***
類的方法,例如getUnfilteredChildCount:return mCallback.getChildCount();
- 第二類方法是除去第一類方法的所有和mHiddenViews相關(guān)的方法
在RecyclerView中mCallback的實現(xiàn)類是在初始化ChildHelper中傳入了一個內(nèi)部匿名類:
new ChildHelper.Callback() {
@Override
public int getChildCount() {
return RecyclerView.this.getChildCount();
}
....
}
從實現(xiàn)類來看奇昙,ChildHelper的Callback接口的實現(xiàn)方法無非是調(diào)用RecyclerView的同名方法而已
ViewHolder中的標記
標記 | 說明 | 應(yīng)用 |
---|---|---|
FLAG_BOUND = 1 << 0 | 這個ViewHolder已經(jīng)和一個位置綁定护侮,mItemId 和 mItemViewType都是有效的 | |
FLAG_UPDATE = 1 << 1 | 這個ViewHolder的視圖對應(yīng)的數(shù)據(jù)不是最新的,需要更新储耐,mPosition 和 mItemId是一致的 | |
FLAG_INVALID = 1 << 2 | 這個ViewHolder的數(shù)據(jù)是無效的羊初,mPosition 和 mItemId 可能不再與itemview的類型相匹配 | |
FLAG_REMOVED = 1 << 3 | 這個ViewHolder指向的數(shù)據(jù)已經(jīng)從item的數(shù)據(jù)集中刪除了,但是它的視圖仍然可以用于outgoing動畫等 | |
FLAG_NOT_RECYCLABLE = 1 << 4 | 這個ViewHolder不應(yīng)該被回收什湘。 這個標志是通過setIsRecyclable()設(shè)置长赞,用于在動畫期間保持子View不變。 | |
FLAG_IGNORE = 1 << 7 | 這個ViewHolder完全由LayoutManager管理闽撤。 我們不會將它加入緩存得哆、回收或移除,除非LayoutManager被替換 | |
FLAG_MOVED = 1 << 11 | 當ViewHolder的position發(fā)生變化時哟旗,由ItemAnimator使用 |
將ChildHelper中的子View放入緩存中 —— detachAndScrapAttachedViews
例如之前在fill中填充布局的順序是按照0->1->2->3->4的順序來添加到RecyclerView中的話贩据,那么現(xiàn)在加入到緩存的順序恰恰相反是按照4->3->2->1->0的順序
- 滿足以下條件則添加到mCachedViews緩存中,且remove對應(yīng)的View
if (viewHolder.isInvalid() && !viewHolder.isRemoved() &&
!mRecyclerView.mAdapter.hasStableIds())
- 滿足以下添加則添加到mAttachedScrap緩存中闸餐,且detach對應(yīng)的View
if (holder.hasAnyOfTheFlags(ViewHolder.FLAG_REMOVED | ViewHolder.FLAG_INVALID)
|| !holder.isUpdated() || canReuseUpdatedViewHolder(holder)) {
- 否則添加到mChangedScrap緩存中饱亮,且detach對應(yīng)的View