如何配置RecyclerView使其不对短列表项进行视图复用?
解决方案
针对条目极少的RecyclerView场景,要禁用视图复用、让所有条目视图保留在层级内,有几种可行的实现方式:
方法1:为每个条目分配唯一的视图类型
RecyclerView的视图复用逻辑基于视图类型,只有同类型的ViewHolder才会被复用。给每个条目设置唯一的视图类型,就能让RecyclerView为每个条目创建独立的ViewHolder,不会复用已有视图:
在你的RecyclerView.Adapter中重写getItemViewType方法,返回当前条目的position作为唯一类型值:
@Override public int getItemViewType(int position) { // 每个position对应唯一的视图类型 return position; }
这样每个条目都会生成独立的ViewHolder,所有视图都会保留在视图层级中,不会被回收复用。
方法2:自定义LayoutManager禁用视图回收
如果需要彻底禁止视图回收(比如即使条目滑出屏幕也不回收),可以自定义LayoutManager,重写recycleChildren方法,跳过回收逻辑:
public class NoRecycleLinearLayoutManager extends LinearLayoutManager { public NoRecycleLinearLayoutManager(Context context) { super(context); } @Override public void recycleChildren(Recycler recycler) { // 不执行任何回收操作,保留所有子视图 } }
然后给RecyclerView设置这个自定义LayoutManager:
recyclerView.setLayoutManager(new NoRecycleLinearLayoutManager(this));
这种方式会让RecyclerView完全不回收任何子视图,所有条目视图都会一直存在于视图层级内。
方法3:设置足够大的视图缓存
通过设置RecyclerView的视图缓存大小为列表总条目数,让所有ViewHolder都被缓存,不会被回收:
// 假设列表总条目数为itemCount recyclerView.setItemViewCacheSize(itemCount);
这种方式下,RecyclerView会缓存所有ViewHolder,当需要显示条目时直接从缓存中获取,视图不会被销毁,始终保留在缓存和视图层级中,适合条目极少的场景。
内容的提问来源于stack exchange,提问作者user1743524
相关产品推荐
相关产品推荐

