kotlin 列表适配器中的dataSetChanged每次都在Recycler视图中显示滚动条

z18hc3ub  于 2023-03-03  发布在  Kotlin
关注(0)|答案(1)|浏览(124)

我有回收站视图与自定义拇指颜色的垂直滚动条:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/messages_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"
    android:scrollbarThumbVertical="@color/orange"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    app:stackFromEnd="true" />

在Recycler View中我显示文本消息。我需要显示消息发送/接收的时间,因此我将时间戳存储在Recycler的dto中:

data class MessageRecyclerDto(
    val sendTs: Long, 
    ...
)

我在onBindViewHolder方法中从当前时间减去时间戳,以计算已经过去了多少时间,并每分钟刷新回收器数据,以显示更新后的文本:

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    holder.bind(getItem(position)) 
}

class ViewHolder(
    private val binding: RecyclerItemChatMessageBinding
) : RecyclerView.ViewHolder(binding.root) { 
    fun bind(dto: MessageRecyclerDto) { 
        val minutesAgoText = (System.currentTimeMillis() - sendTs).millisToMinutes().toString()
        binding.timeAgoTv.text = minutesAgoText binding.executePendingBindings() 
    }
}

问题是每次我调用适配器的notifyItemRangeChanged或notifyDataSetChanged方法时,回收器视图中的滚动条会出现一会儿,然后消失一会儿。这是滚动操作的默认行为。此外,我在同一个Fragment中有另一个回收器视图,滚动条也会出现在其中。回收器视图不相关,它们有不同的适配器。
我不想完全隐藏滚动条,也不想一直显示滚动条。有什么办法可以禁用这种行为吗?或者有人有其他解决方案,可以在回收者视图中显示经过的时间,并定期刷新。

sd2nnvve

sd2nnvve1#

如果你想滚动条只显示当用户拖动这张表你应该做它手动(禁用/启用滚动条).
你需要添加addOnScrollListener和检测滚动,以启用滚动条之前notifyDataSetChanged禁用滚动条.类似这样的东西:

messagesRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
    // Check if the user has scrolled the RecyclerView
    if (dy != 0) {
        // Show the vertical scrollbar
        recyclerView.isVerticalScrollBarEnabled = true
    }
  }
})

并在呼叫更改之前禁用它:

recyclerView.isVerticalScrollBarEnabled = false
adapter.notifyDataSetChanged()

相关问题