使用RecyclerView的正确方法是什么?

3
我的任务是开发一个不同类型问题的列表,即调查。它可以包括像整数回答问题、长文本回答问题等类型。
为什么需要一个列表呢?因为对于使用应用程序的人来说,向下滚动回答每个问题比向右滑动或执行其他操作要好得多。
所以我面临着使用ListView还是RecyclerView的困境。我的研究得出了使用RecyclerView并为我拥有的不同类型的问题设置ViewHolder的最终结果。
当我意识到有一种类型的问题与它相关时,我遇到了困难;怎么回事?如果您选择一个选项,那么您必须“显示”一些问题,如果您取消选择此选项,则必须再次“隐藏”它。
问题在于我需要知道每个问题与其ViewHolder的参考资料,以便“显示”或“隐藏”它们,但如果Recycler正在循环使用viewHolder,则可能会在我的逻辑上创建混乱。
我的准确问题是:我是否正在使用正确的RecyclerView组件?是否有任何方法可以访问具有唯一引用的ViewHolder,例如ID或其他内容?
如果你需要我展示一些代码,我会很乐意去做。
重要信息:
如果你对如何使用 notifyDataSetChanged() 感兴趣,你可以访问 link 获取进一步和详细的信息。 Minas mina 的方法是正确的!
1个回答

0

如果我理解正确,您需要在用户选择某个选项时隐藏某些类型的问题。


您对视图持有者的理解不太正确。视图持有者缓存了一堆视图,稍后在onBindViewHolder()中使用这些视图来填充来自模型对象的数据。

实际的模型对象应该在适配器中。在您的情况下,类似于:

List<Question> questions

onBindViewHolder()中,您可以使用来自Question对象的数据填充View holder的字段。
至于您的问题,您可以在recyclerView适配器中设置一个标志,例如hideQuestionsOfTypeAtrue,然后调用适配器上的notifyDatasetChanged()
在绑定对象时,检查该标志是否为true,如果是,则将需要隐藏的视图的可见性设置为GONE

我对onBindViewHolder()的理解来自于这里:https://dev59.com/T1oU5IYBdhLWcg3wYWOx#37524217,它说:“不是为每一行创建新视图,而是通过将新数据绑定到旧视图来回收和重用旧视图。”所以如果我隐藏一个viewHolder(通过将LayoutParams设置为0),那么如果它与另一个问题相关联,它会复制相同的行为。我的理解是否正确? - cancinos
@PabloAndrésCancinos,这是一个很好的解释。我认为根据标志隐藏一些问题不会成为问题,就像我上面建议的那样 :) 如果我没有正确理解问题,请告诉我。 - Minas Mina
1
@PabloAndrésCancinos,是的,你是(幸好:))错误的!一个View Holder只能“关联”一次问题。因此,在View Holder中进行更改不会影响屏幕上的任何其他项目。我鼓励你找到一个RecyclerView示例项目并尝试操作它以更好地理解它的工作原理。 - Minas Mina
1
现在一切都清楚了!我现在不在办公室,但明天早上我会测试它!救了我的一天,伙计! - cancinos
@cancinos 没问题。如果有帮助的话,您能否接受答案? - Minas Mina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接