阿里面试总共4轮,其中有3轮面试都问到了RecyclerView的问题。面试的点各不相同,有原理、嵌套问题、有缓存实现,但是最终都是殊途同归,所有的问题都汇集在,如何对RecyclerView做性能优化?
一、RecyclerView第一次layout时,会发生预布局pre-layout吗?
第一次布局时,并不会触发pre-layout。pre-layout只会在每次notify change时才会被触发,目的是通过saveOldPosition方法将屏幕中各位置上的ViewHolder的坐标记录下来,并在重新布局之后,通过对比实现Item的动画效果。比如以下效果:

二、 如果自定义LayoutManager需要注意什么?
在RecyclerView的dispatchLayoutStep1阶段,会调用自定义LayoutManager的 supportsPredictiveItemAnimations 方法判断在某些状态下是否展示predictive animation。以下LinearLayoutManager的实现:
@Override
public boolean supportsPredictiveItemAnimations() {
return mPendingSavedState == null && mLastStackFromEnd == mStackFromEnd;
}
如果 supportsPredictiveItemAnimations 返回true,则LayoutManager中复写onLayoutChildren方法会被调用2次:一次是在pre-layout,另一次是real-layout。

本文详述了字节跳动面试中关于RecyclerView的高频问题,包括预布局、自定义LayoutManager、ViewHolder缓存和性能优化策略。阐述了RecyclerView第一次layout不触发pre-layout的情况,自定义LayoutManager时的注意事项,ViewHolder何时进入RecycledViewPool,以及CachedView和RecycledViewPool的区别。同时,提出了优化RecyclerView的实践建议,如异步处理数据、避免复杂布局和利用RecycledViewPool提高性能。
最低0.47元/天 解锁文章
907

被折叠的 条评论
为什么被折叠?



