我使用分页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以在顶部显示所选项目