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