RecyclerView_onBindViewHolder 被調用的時機

1,問題

onBindViewHolder是RecyclerView數據更新的統一處理位置,那麼它被調用的入口在哪?

 

2,方案

場景:初次加載、滑動

方案:debug模式下,查看調用鏈

 

3-1,初次加載場景,入口以及調用鏈

RecyclerView.onLayout()		// 初始化場景,入口
RecyclerView.dispatchLayout()
RecyclerView.dispatchLayoutStep2()

LinearLayoutManager.onLayoutChildren()
LinearLayoutManager.fill()
LinearLayoutManager.layoutChunk()
LinearLayoutManager.next()	

RecyclerView.Recycler.getViewForPosition()
RecyclerView.Recycler.tryGetViewHolderForPositionByDeadline()    // 獲取緩存開始的地方
RecyclerView.Recycler.tryBindViewHolderByDeadline()
RecyclerView.Adapter.bindViewHolder()
RecyclerView.Adapter.onBindViewHolder()
RecyclerView.Adapter.onBindViewHolder()	// 等待實現的方法

3-2,滑動時,入口以及調用鏈

RecyclerView.onTouchEvent()		// MotionEvent.ACTION_MOVE 作爲入口
RecyclerView.scrollByInternal()
RecyclerView.scrollStep()

LinearLayoutManager.scrollVerticallyBy()
LinearLayoutManager.scrollBy()
LinearLayoutManager.fill()
LinearLayoutManager.layoutChunk()
LinearLayoutManager.next()	

RecyclerView.Recycler.getViewForPosition()
RecyclerView.Recycler.tryGetViewHolderForPositionByDeadline()    // 獲取緩存開始的地方
RecyclerView.Recycler.tryBindViewHolderByDeadline()
RecyclerView.Adapter.bindViewHolder()
RecyclerView.Adapter.onBindViewHolder()
RecyclerView.Adapter.onBindViewHolder()	// 等待實現的方法

3-3,滑動時,GapWorker入口以及調用鏈

RecyclerView.onTouchEvent()		// MotionEvent.ACTION_MOVE 作爲入口

GapWorker.postFromTraversal()
RecyclerView.post(GapWorker)	// 這裏是 利用了 View.post() 放到下一幀執行

GapWorker.run()
GapWorker.prefetch()
GapWorker.flushTasksWithDeadline()
GapWorker.flushTaskWithDeadline()
GapWorker.prefetchPositionWithDeadline()

RecyclerView.Recycler.tryGetViewHolderForPositionByDeadline()	// 獲取緩存的位置
RecyclerView.Recycler.tryBindViewHolderByDeadline()
RecyclerView.Adapter.bindViewHolder()
RecyclerView.Adapter.onBindViewHolder()
RecyclerView.Adapter.onBindViewHolder()	// 等待實現的方法

 

4,結論:

在初始化場景,入口爲 onLayout方法

在滑動場景,入口爲 onTouchEvent 方法,參數爲Action_Move  而且,會調用view.post() 使用GapWorker

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章