【问题标题】:How to get previous position in RecyclerView's Adapter itself?如何在 RecyclerView 适配器本身中获得以前的位置?
【发布时间】:2020-06-04 16:54:47
【问题描述】:

我有一个 RecyclerView,在它的布局中有一个视图“tvDateGrouped”,我希望它仅在当前位置日期和上一个位置日期不同时显示。 下面是我试过的代码,但它不起作用

这段代码在适配器类中,在 onBind() 方法中

  if (position != 0 && transactions[position].date == 
    transactions[holder.adapterPosition.minus(1)].date) {
                holder.view.tvDateGrouped.visibility = View.GONE
            } else {
                holder.view.tvDateGrouped.text = formattedDateString
            }

如果我改变位置 != 1 ,应用程序崩溃

以下是应用崩溃时的代码

  if (position != 1 && transactions[position].date == 
        transactions[holder.adapterPosition.minus(1)].date) {
                    holder.view.tvDateGrouped.visibility = View.GONE
                } else {
                    holder.view.tvDateGrouped.text = formattedDateString
                }

编辑:我已将代码更改如下,但应用程序现在崩溃了-

if ((transactions[position].date == transactions[position - 1].date) && 
(position > 0)) {
    holder.view.tvDateGrouped.visibility = View.GONE
} else {
    holder.view.tvDateGrouped.visibility = View.VISIBLE
    holder.view.tvDateGrouped.text = formattedDateString
}

请帮我解决这个问题

【问题讨论】:

  • 0 - 1 = -1,无效索引。在第一段代码中,您可以防止这种情况发生,但在第二段代码中没有。

标签: android kotlin android-recyclerview android-adapter realmrecyclerviewadapter


【解决方案1】:

position0 然后position - 1 将是-1 这是一个无效索引并且你会得到一个运行时异常时,你的崩溃只是发生了。

但为什么第一个解决方案不起作用?一个明显的原因是因为您忘记让文本再次可见。所以改成:

 if (position > 0 && transactions[position].date == transactions[position - 1].date) {
    holder.view.tvDateGrouped.visibility = View.GONE
} else {
    holder.view.tvDateGrouped.visibility = View.VISIBLE
    holder.view.tvDateGrouped.text = formattedDateString
}

【讨论】:

  • 嗨@Mohammad,谢谢你,代码工作但不完全符合我的要求。似乎每次 else 块都在执行,所以为了确保一切正常,我将 if 语句更改为 if (transactions[position].date == transactions[position - 1].date && position > 0) 现在,应用程序崩溃了,似乎 transactions[position].date == transactions[position - 1].date line 中有一些错误
  • 解决方案有效但不完全,请查看我的上述评论
  • @AnmolSinghSahi 你是什么意思,但不完全是?您期望但没有看到什么行为?关于崩溃:布尔值的顺序很重要。规则是,如果 and 操作的左操作数为假,则不计算右操作数。因此,当您将position > 0 向右移动时,前一部分运行为零并崩溃!
  • [link] (imageshack.com/i/pnQFv4tWp),请查看此链接,“tvDateGrouped”是顶部的灰色圆角信息选项卡,它每次都显示,但我希望它仅在日期与前一个日期不同,即我想完全像聊天应用一样显示它(WhatsApp)
  • @AnmolSinghSahi 检查您的date 字段是否包含时间。我猜它包含时间和平等永远不会发生。如果为真,则仅对日期部分进行相等性检查。
猜你喜欢
  • 2017-05-13
  • 2020-12-12
  • 1970-01-01
  • 2023-03-05
  • 2018-12-19
  • 1970-01-01
  • 2016-05-19
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多