2016-12-27 69 views
1

内部使用时,我将使用RecyclerView(水平布局)在另一个RecyclerView(垂直布局)内部使用时,何时清除来自内部RecyclerView的听众。一切正常。现在我想添加RecyclerView.OnScrollListener听众到内部RecyclerView当在另一个RecyclerView(外部)

我正在向适配器回调的onViewAttachedToWindow的内部RecyclerView添加一个侦听器,并在onViewDetachedFromWindow上清除它。它工作正常。但是如果我从片段中返回,我没有收到onViewDetachedFromWindow的任何回叫,因此听众仍然将添加到内部RecyclerView s。

现在我的问题是:

  • 威尔片段的onDestroyView结果从清除了所有的听众的内心RecyclerView S'
  • 由于我在外部RecyclerViewViewHolder内部创建了侦听器的实例,它的碎片被破坏时它也会自动销毁吗?

如果没有以上会发生,我应该如何清除这些听众,因为这可能会导致内存泄漏的听众举办RecyclerView的参考?

回答

1

我创建了一个自定义RecyclerView(内部)并覆盖它的onScrollStateChanged方法,并且已经实现了滚动 - 更改了那里的逻辑。

我还必须为侦听器设置一些自定义数据集,我将此设置为RecyclerView的适配器。

1
  • 威尔片段的onDestroyView结果清理掉所有的听众从这些内部RecyclerViews ?

  • 因为我在外部RecyclerView的ViewHolder内部创建了侦听器的实例,所以当它的Fragment被销毁时它会自动销毁?

我不认为这会,而不是这可能会导致内存泄漏。

onViewDetachedFromWindow未被调用的原因是因为ViewHolder未从其父项中移除。

我认为最好将听众的所有权移到视图所有者(Activity/Fragment)而不是外部RecyclerView。但是,如果您仍希望保留当前实施的所有权,则可以尝试在LinearLayoutManager中拨打setRecycleChildrenOnDetach(true),以使LinearLayoutManagerRecyclerView分离时删除所有视图。

+0

这看起来很有前途,将检查和更新。谢谢 –

+1

感谢Niko的回答。但是在doc中提到的解决方案存在一个问题**请注意,如果RecyclerView恢复,设置此标志将导致性能下降。**我找到了另一个解决方法。无论如何,upvoting你的答案。 :) –

+1

@RohitArya是的,实际上这种方式只建议使用自己的RecyclerView Pool,很高兴您找到了解决方案! :) –

0

是的,您可以利用onDestroyView并将回调仅发送给您的外部RecyclerView父组件,以便仅负责设置内部RecyclerView的侦听器,该侦听器可以为null。