在垂直 RecyclerView 中显示水平 RecyclerView 时获得闪烁效果

Posted

技术标签:

【中文标题】在垂直 RecyclerView 中显示水平 RecyclerView 时获得闪烁效果【英文标题】:Getting Flickering Effect When Showing Horizontal RecyclerView inside Vertical RecyclerView 【发布时间】:2016-09-14 13:44:52 【问题描述】:

我有一个VerticalRecyclerView,而这个垂直的RecyclerView's每一项都包含Horizontal RecyclerView。所以除了性能因素外,我已经完成了这项工作并且工作正常,当我滚动Vertical RecyclerView 时,垂直列表会闪烁并给出不良行为。我将Adapter 设置为水平RecyclerView 在垂直RecyclerView 内,所以每次滚动我都在创建一个新的适配器并设置数据,实际上这会导致性能。有什么办法可以优化吗?

代码

onBindViewHolder()
  setHorizontalList(items, horizontalolder);


setHorizontalList(ArrayList<Item> items, HorizontalHolder holder)
  MyAdapter adapter = new MyAdapter();
  adapter.setData(items);
  holder.recyclerView.setAdapter(adapter);
  holder.recyclerView.setLayoutManager(new LinearLayoutManager(mContext,
                    LinearLayoutManager.HORIZONTAL, false));
  holder.recyclerView.setHasFixedSize(true);

【问题讨论】:

您找到解决方案了吗?我已经看到了类似的问题,我的内部项目背景不正确 wrap_content 应该是。 是的。我为 ViewHolder 类中的第二个 RecyclerView 创建了适配器。这样它就不会创建新实例。 我也做了同样的事情,但我的背景变得很不稳定。你介意快速看看我的问题吗? ***.com/questions/40823501/… 【参考方案1】:

性能很差,因为您将setHasFixedSize(boolean) 设置为true,这将导致每个嵌套的水平RecyclerView 在垂直RecyclerView 可见时加载其所有视图。将固定大小设置为true 通常用于使RecyclerView 包装其内容。但是要包装自己的内容,他必须知道其内容的大小,因此他必须在可见时创建所有视图(知道他的最大高度和宽度)。

优化嵌套RecyclerViews 的最佳方法是不将固定大小设置为true。但这可能会导致嵌套RecyclerViews 无法完全显示,因为它不知道他的高度(因为RecyclerView 中的不同视图可以有不同的高度)。解决此问题的一种方法是使用硬编码的高度或创建自己的 CustomRecyclerView 类来扩展 RecyclerView 并覆盖测量方法。

【讨论】:

不工作,问题是因为在 onBindViewHolder() 中创建了适配器,这就是我需要优化的。

以上是关于在垂直 RecyclerView 中显示水平 RecyclerView 时获得闪烁效果的主要内容,如果未能解决你的问题,请参考以下文章

在垂直 recyclerView 中带有 wrap_content 的水平 recyclerView

具有垂直和水平滚动的 Recyclerview

java 自动为RecyclerView项添加相等的间距。可以处理水平,垂直和网格显示模式

java 自动为RecyclerView项添加相等的间距。可以处理水平,垂直和网格显示模式

在水平和垂直的recyclerview中膨胀布局,具有recycler视图的FlexboxLayout添加视图水平自动垂直

在水平和垂直Recyclerview中滚动问题