繁体   English   中英

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

RecyclerView: how to clear cached/recycled views?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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

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

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

更新:

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

8 个回复

采用

recyclerView.getRecycledViewPool().clear();

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

recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

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

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

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

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

您需要调用setLayoutManager(null)setAdapter(null) 如果你想保留你的适配器,你可以做一些像adapter = getAdapter(); setAdapter(null); setAdapter(adapter); adapter = getAdapter(); setAdapter(null); setAdapter(adapter);

它们的关键是重写getItemViewType(int position)并设置它以便我可以检查我正在处理该位置的视图类型(列表或网格),然后在onbindViewHolder()为该位置设置适当的视图处理。 下面,当用户点击菜单按钮更改格式时, viewFormat只是我设置为列表或网格的int。

@Override
    public int getItemViewType(int position) {
        if (listData.size() == 0) {
            return EMPTY_VIEW;
        } else if (viewFormat == Constants.LIST_FORMATTED) {
            return Constants.LIST_FORMATTED;
        } else if (viewFormat == Constants.GRID_CONDITION) {
            return Constants.GRID_CONDITION;
        }
        return super.getItemViewType(position);
    }

在我的原始帖子上发表评论的用户让我意识到这一点,但遗憾的是这些评论已被删除。 我感谢那位用户指出了我正确的方向。

Recyclerview具有视图缓存以及回收视图池(视图持有者池)。

缓存是视图(具有填充数据的视图)。 当LayoutManager告诉recyclerview该视图不再可见且需要时,recyclelerview会检查该视图是否仍然对特定位置有效,如果该视图有效则将其添加到缓存中,因此当下次LM要求查看该位置时,它将返回从缓存原样。

那么什么是回收视图池? 当从缓存中删除视图或没有更多有效视图时,将清除与这些视图相关的数据,并且只有视图持有者对象保留在池中。 根据itemType,池可以具有不同项类型的视图持有者。

现在,在您的情况下,您的视图对于该特定位置无效,因为您想要显示完全不同的视图。 因此,您的适配器应该告诉recyclerview所有视图都是无效的。 唯一的方法是对所有项目使用notifyDataSetChanged。 Recyclerview将从缓存中删除视图并将其添加到recyler视图池。 所以现在,当LM请求视图时,将返回循环视图(根据itemType)或新创建的视图,并且适配器将数据绑定到这些视图。

做这个简单!!

adapter.notifyItemRangeRemoved(0,adapter.getItemCount());

  adapter.notifyItemRangeRemoved(0,adapter.getItemCount());
                   for (int i = 0; i < array.length(); i++) {
                        JSONObject object = array.getJSONObject(i);
                         ////
                        data_List.add(data);
                    }
final int targetCacheSize = 2;
    recyclerView.setItemViewCacheSize(Integer.MIN_VALUE);
    recyclerView.getRecycledViewPool().clear();
    recyclerView.setItemViewCacheSize(targetCacheSize);
2 RecyclerView如何处理不同视图的回收?

当我们在RecyclerView中拥有异构视图时,它如何处理回收? 例如,在以下代码中,我们创建了3种不同类型的视图,以便在回收站视图中使用。 现在,在这些观点被夸大之后,recyclerView如何知道不将这些视图用于其他项目的位置1和2? ...

3 RecyclerView设置要回收的视图

在我的应用中,我正在实现recyclerview。 根据我为要在recyclerview上显示的数据设置的选项,此recyclerview的数据集的大小将有所不同。 我对recyclerview采取的一项操作是在单击某个项目时“扩展”该项目,并在其中显示更多选项。 当按下此“扩展”项目 ...

4 阻止RecyclerView回收特定视图

我目前正在开发一个可从互联网下载视频的应用程序。 我正在使用RecyclerView显示视频列表,并且在每个项目中都使用了ProgressBar。 问题是,当下载开始时,ProgressBar会显示下载进度,但是当我尝试滚动甚至触摸屏幕时,进度会回落到0。 我的问题是:是否有预防方法? ...

5 如何清除回收商视图项目?

我正在开发应用程序,因为我使用了回收站视图来显示来自 firebase 的数据。 当用户注销时,回收者视图中的项目不会销毁。当其他用户登录时,他/她可以看到以前的用户数据。 当用户按下注销按钮时,我如何清除回收站视图。我试图清除应用程序中的所有数据,但它关闭了应用程序,用户需要重新单击该应用程序。 ...

6 重置RecyclerView缓存的视图

我在RecyclerView.onBindViewHolder实现了setSelected ,它选择了用户点击的行。 如果用户选择另一行,则前一行也将被取消选择。 问题是,当我向下滚动视图以便隐藏先前选择的行,然后选择新行然后向上滚动时,会从缓存中检索到旧行并选择其视图。 有什么方法可 ...

7 如果视图计数很小,RecyclerView不会回收视图

我一直在处理Recycler View中的一个奇怪的行为,如果适配器中的视图计数很小,在我的情况下大小为5,视图没有被回收,并且当视图滚动回屏幕时不会调用onBindViewHolder。 例如,如果我将大小增加到10个视图,则回收开始工作,每次视图进入屏幕时都会调用onBindViewHol ...

9 管理如何在 RecyclerView 中回收视图

我正在寻找一种方法来过滤 RecyclerView 中的数据,而不会在应用过滤器时给定视图的状态影响另一个视图。 实际上,我遇到了这个问题: 1. 我通过单击添加按钮(图像 msSxq.png)列表而不使用过滤器将“Martins”添加到我的朋友列表中 我执行搜索并得到这个(图像 FGSwF. ...

10 RecyclerView部分回收了一些视图

我有一个应用程序,根据比赛 日期显示一些足球比赛的比赛日 。 我正在使用微调器根据用户选择的一些dummyData() 重新创建 RecyclerView的适配器。 但是有时在RecyclerView首次初始化或回收时,它实际上显示了.xml的格式。 我设法通过在Adapter上添加自 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM