如何发现分页数据适配器中的第一项已更改



我使用分页3对我的项目进行分页,然后在回收器视图中显示它们。但有一段时间第一个项目会发生变化。例如,考虑以下情况:

item A
item B
item C

过了一段时间,由于某种原因,数据得到更新,列表顺序更改为如下所示:

item B
item A
item C

我的问题是:

回收器视图正好停留在最后一个位置。我的意思是,当更新应用时,项目B将转到第一个位置,但回收器视图不会滚动到顶部,它只是指向项目A,用户不会通知项目B已经更改,

如何在第一个项目更改时自动设置回收器视图滚动?

这是我的适配器的一部分:

class TicketListAdapter :  PagingDataAdapter<TicketListModel, TicketListAdapter.ViewHolder>(
diffCallback =      object : DiffUtil.ItemCallback<TicketListModel>() {
override fun areItemsTheSame(oldItem: TicketListModel, newItem: TicketListModel): Boolean {
return oldItem.ticket_id == newItem.ticket_id
}
override fun areContentsTheSame(
oldItem: TicketListModel,
newItem: TicketListModel
): Boolean {
return oldItem == newItem
}
}
){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.ticket_list_item_model, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int)= holder.bind(getItem(position))

这里展示了我如何使用我的回收器视图和数据:

binding.recyclerView.apply {
this.adapter = adapter
this.layoutManager = LinearLayoutManager(requireContext())
}
viewModel.tickets.observe(viewLifecycleOwner, {
viewLifecycleOwner.lifecycleScope.launch {
adapter.submitData(it)
}
})

我也尝试过设置观察器,但它不起作用:

adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
if (adapter.getItemId(0) != firstItemId) {
binding.recyclerView.smoothScrollToPosition(0)
firstItemId = adapter.getItemId(0)
}
}

firstItemId被初始化为值-1;

调用adapter.notifyDataSetChanged()将使recyclerview重新加载,然后您的项目应该进行调整。

关于滚动(一式两份(,请查看此处:滚动RecyclerView以在顶部显示所选项目

最新更新