如何在共享元素转场动画中增加RecyclerView存活绑定项数量?
如何增加RecyclerView的存活绑定项数量以支持共享元素转场?
刚好做过类似的需求!要让RecyclerView保留更多存活绑定的item来支持共享元素转场,核心就是让那些可能参与转场的item不被RecyclerView回收掉,我给你分享几个实用的实现方法:
方法一:调大Item View缓存大小
RecyclerView默认只会缓存屏幕外的2个item(上下各一个),如果你的共享元素转场需要涉及更远的item,直接调大缓存数量就行。用setItemViewCacheSize()方法设置一个合适的数值,比如屏幕可见item数的2倍,或者根据你实际需要转场的item范围来定:
// 比如设置缓存10个item,具体数值根据你的布局调整 recyclerView.setItemViewCacheSize(10);
这个方法简单直接,适合大多数场景——缓存里的item会保持绑定状态,不会被回收,转场时就能顺利找到对应的View了。
方法二:自定义LayoutManager,预留额外布局空间
如果调大缓存还不够(比如需要转场的item距离屏幕很远),可以自定义LayoutManager,重写calculateExtraLayoutSpace()方法,让RecyclerView提前布局屏幕外的item,这些布局好的item会处于存活绑定状态。
以LinearLayoutManager为例,代码如下:
LinearLayoutManager layoutManager = new LinearLayoutManager(this) { @Override protected int calculateExtraLayoutSpace(RecyclerView.State state, int[] extraLayoutSpace) { // 这里设置顶部和底部的额外布局空间,比如屏幕高度的1.5倍(单位是像素) int extraSpace = (int) (getResources().getDisplayMetrics().heightPixels * 1.5); extraLayoutSpace[0] = extraSpace; // 顶部额外空间 extraLayoutSpace[1] = extraSpace; // 底部额外空间 return super.calculateExtraLayoutSpace(state, extraLayoutSpace); } }; recyclerView.setLayoutManager(layoutManager);
这个方法会让RecyclerView在布局时,除了屏幕可见区域,还会在上下额外布局出指定高度的item,这些item不会被回收,完美适配需要远距离item转场的场景。
方法三:结合两种方式,兼顾效果与性能
如果单独用一种方法达不到预期,建议把上面两种方式结合起来:先调大缓存数量,再设置合适的额外布局空间。这样既能保证需要转场的item都处于存活绑定状态,又不会过度占用内存(毕竟缓存和额外布局的item太多会增加内存消耗)。
注意事项
- 不要盲目设置过大的数值,否则会导致内存占用过高,影响应用性能。建议先测试你的转场需求需要覆盖多少个item,再针对性设置。
- 如果是GridLayoutManager或者其他自定义LayoutManager,同样可以通过重写
calculateExtraLayoutSpace()来实现类似效果,原理是一样的。
内容的提问来源于stack exchange,提问作者No Soy Beto
相关产品推荐
相关产品推荐

