【问题标题】:Correct approach on using RecyclerView?使用 RecyclerView 的正确方法?
【发布时间】:2018-03-01 21:28:19
【问题描述】:

我的任务是制定一份不同类型问题的列表,即调查。它可能包括整数-答案-问题、长文本-答案-问题等类型。

为什么需要一个列表?因为对于使用该应用程序的人来说,向下滚动回答每个问题比向右滑动或做其他动作要好得多。

所以我面临着使用 ListView 或 RecyclerView 的困境。我的研究给出了使用 recyclerView 并为我遇到的不同类型问题设置 viewHolder 的最终结果。

当我意识到有一种类型的问题与之相关时,我遇到了困难;为何如此?如果您选择一个选项,则必须“显示”一些问题,如果取消选择此选项,则必须再次“隐藏”它。

问题是我需要知道每个问题对他们的 viewHolder 的引用,以便“显示”或“隐藏”每个问题,但如果回收商正在回收 viewHolders,那么它可能会在我的逻辑上造成混乱。

我的准时问题是:我是否在 RecyclerView 中使用了正确的组件?有没有办法访问具有唯一引用的 viewHolder,比如和 id 之类的?

如果您需要我展示一些代码,我会很乐意这样做。

有价值的信息:

如果您对 notifyDataSetChanged() 的工作原理感兴趣,可以访问此link 以获取更多详细信息。

Minas mina 的方法是正确的!

【问题讨论】:

    标签: java android android-recyclerview notifydatasetchanged


    【解决方案1】:

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


    您对视图持有者应该做什么的理解并不完全正确。视图持有者缓存了一堆视图,您稍后会在onBindViewHolder() 中使用这些视图来填充您的模型对象中的数据。

    实际的模型对象应该在您的适配器中。在你的情况下,像

    List<Question> questions
    

    onBindViewHolder() 中,您使用来自Question 对象的数据填充视图持有者的字段。

    至于您的问题,您可以做的是在您的 recyclerView 适配器中设置一个标志,例如hideQuestionsOfTypeAtrue 然后在适配器上调用 notifyDatasetChanged()

    绑定对象时,检查该标志是否为真,如果是,则将可见性设置为GONE,以显示需要隐藏的视图。

    【讨论】:

    • 我对 onBindViewHolder() 工作原理的理解来自这里:stackoverflow.com/a/37524217/5352887,它说“不是为每个新行创建新视图,而是通过绑定新数据来回收和重用旧视图给它。”因此,如果我隐藏一个 viewHolder(通过隐藏我的意思是将 LayoutParams 设置为 0),那么如果它与另一个问题相关联,它将复制相同的行为。我错了吗?
    • @PabloAndrésCancinos 这是一个很好的解释。我不明白根据标志隐藏一些问题会有什么问题,就像我上面建议的那样:) 如果我没有正确理解问题,请告诉我。
    • @PabloAndrésCancinos 是的,你是(谢天谢地:))错了!一个视图持有者一次只能与一个问题“关联”。因此,在视图持有者中进行更改不会影响屏幕上的任何其他项目。我鼓励您仅找到一个回收站视图示例项目并使用它来更好地了解它的工作原理。
    • 现在一切都清楚了!我现在不在办公室,但明天早上我会测试它!拯救我的一天,伙计!
    • @cancinos 没问题。如果对您有帮助,您能接受答案吗?
    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多