RecyclerView:如何清除缓存/回收的视图?

mra*_*tor 24 android recycler-adapter android-recyclerview

我使用RecyclerView显示具有列表布局的项目列表.我从列表布局切换到网格布局,在网格布局中仅显示所有数据的子集.此开关使用与列表布局呈现时不同的布局XML.

所有这一切都很好,除了当我滚动,回收(缓存?)列表布局视图填充网格,与适当的网格布局视图项混合.换句话说,我不是layout_grid.xml在RecyclerView 中使用my 为每个项目的layout_list.xml布局,而是使用布局获取项目,但是采用网格格式.

这告诉我LayoutManager工作正常,从列表切换到网格布局.但并非所有项目视图项都使用网格xml布局重新创建,而是使用回收列表布局视图.

我试过RecyclerView.removeAllViews(),RecyclerView.removeAllViewInLayout(),RecyclerView.swapAdapter()(强制适配器重装),都无济于事.

更新:

如果我在列表中向下滚动两个位置,然后从列表切换到网格,前两个位置不会通过onCreateViewHolder(),而是直接到onBindViewHolder(),因此不会强制使用网格布局xml.相反,前两个位置项目被回收(我认为)并以列表布局格式显示.

小智 23

使用

recyclerView.getRecycledViewPool().clear();
Run Code Online (Sandbox Code Playgroud)


gof*_*flo 8

我有同样的问题.Mann提出的解决方案效果很好.另一种选择是将RecyclerView的RecycledViewPool设置为新实例.这对我也有用.

recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
Run Code Online (Sandbox Code Playgroud)

但我认为重写getItemViewType()是更清晰的解决方案.


Man*_*ann 6

好的,我明白了.你使用两种布局?有一种方法可以返回列表/网格元素(id/position)的viewtype.您也正确地实现了此方法,即适配器可以为新视图回收正确的布局.你明白我的意思吗?:)


cot*_*aws 6

听起来接受的答案对于你的情况是正确的,返回一个不同的viewType可能就是你需要做的.

如果有人确实需要找到一种方法来清除缓存的视图持有者并最终进入这个线程,那么我发现这是有效的.

你需要打电话setLayoutManager(null)setAdapter(null).如果你想保留你的适配器,你可以做类似的事情adapter = getAdapter(); setAdapter(null); setAdapter(adapter);

  • 在我的情况下,设置 `layoutmanager(null)` ** 和 ** `setAdapter(null)` 对我有用。这使我免于拔头发! (2认同)