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

 

 

 

你可能感兴趣的:(Android_源码)