如何访问隐藏的RecyclerView项目?

时间:2016-04-27 10:41:26

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

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

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

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

现在执行动作(在这里拖放),我修改了每个项目中的内容。这种情况正在发生。

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

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

我在适配器中使用了回传器视图的getChildCount()方法,它将值显示为5(而不是6)。我进行了调试,发现它正在考虑屏幕上可见的儿童数量。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

RecyclerView的名称有其正当之处。只创建了可见的项目(加一个),然后每当一个项目消失时,另一个项目将被重新用于任何新出现的项目。这就是为什么它会稍微向上移动您的视图。现在你有六个项目可见。

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