【问题标题】:How to access hidden RecyclerView items?如何访问隐藏的 RecyclerView 项目?
【发布时间】:2016-04-27 10:41:25
【问题描述】:

我尝试搜索这个问题,但找不到合适的解决方案。

基本上,我有一个包含 RecyclerView 的布局,有 6 个项目。

在 6 个项目中,有 5 个在屏幕上可见。第六是隐藏。

现在在执行一个动作(拖放到这里)时,我会修改每个项目中的内容。这正在发生。

但是,仅适用于可见项目。

当我在执行操作后向下滚动到第 6 项时,它不会显示更改。只有可见的 5 个可以。

我在适配器中使用了getChildCount() 回收器视图方法,它显示的值为 5(不是 6)。我调试后发现它目前正在考虑将孩子的数量视为屏幕上可见的数量。

如果我向下滚动一点,那么第 1 项的下方和第 6 项的上半部分是可见的,并执行修改所有项目内容的操作 - 它有效!

我认为使用 LinearLayoutManager 是一种解决方案,因为它在任何情况下都会将 itemCount 返回为 6,但无法理解如何使用它来访问 RecyclerView 的项目/子项。

我故意尝试使用 getChildAt(5) 访问和修改 RecyclerView 的第 6 项,但我得到了 NullPointerException,因为 RV 无法识别该项目,因为它在屏幕上是不可见的。

此外,在执行操作时,项目内容的修改是使用在 RV 适配器中键入的代码在自定义方法中执行的,而不是通过获取对视图的引用,而不是像 onBindViewHolder(...) 这样的 RecyclerView 适配器的覆盖方法并在getChildAt() 的帮助下访问他们的子视图。

我怀疑是否需要代码,但如果需要,请告知。我正在使用自定义 DragListener 类,我在其中访问每个 RecyclerView 项的视图、子视图并修改数据。

如何访问 RV 的所有项目(可见和隐藏)并一次性修改它们?

【问题讨论】:

  • 我想这很明显,因为访问项目和修改的合法方式是通过 OnBindViewHolder(...)。如果正确,那么我该如何让它与 OnDragListener 方法一起使用?因为如果我在 Adapter 中使用 OnDragListener,对于某些功能,我无法让它同时与 Adapter 方法协调。我希望我很清楚......
  • 你为那个项目打电话给notifyItemChanged(position)
  • 对不起 Qamar,但我看不出我的问题和这种方法之间有什么联系。也许您必须通过解决我的问题来详细说明并让我理解
  • 请澄清您的问题,以免人们猜错。用更少的词来解释。您是否需要更改为该不可见项目视图发布的视图或数据?
  • 这种情况你可以先确认一下。抱歉,但我想提供完整的图片以获得完美的解决方案。只要时间允许,也许可以逐字逐句慢慢读一遍。我想修改item中的数据。

标签: android drag-and-drop android-recyclerview


【解决方案1】:

您不能通过直接操作其子项来修改 RecyclerView 的项。相反,您必须通过更改适配器中的项目来应用所有更改。

假设您有一个标题,并且该标题现在在重新排序后会发生变化。然后您必须更改适配器中所有元素的标题。最后你必须触发这些项目被重绘。

RecyclerView 有它的名字是有原因的。仅创建可见项目(加一个),之后每当一个项目消失时,另一个项目将被重新用于任何新出现的项目。这就是为什么如果你稍微向上移动你的视图它会起作用。现在您可以看到六个项目。

对于足够大的数据集,子项数远低于构成所显示数据基础的项目数。因此,您无法使用 RecyclerView 的子项更改数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多