如何找出分页数据适配器中的第一项已更改
Posted
技术标签:
【中文标题】如何找出分页数据适配器中的第一项已更改【英文标题】:how to find out first item has changed in paging data adapter 【发布时间】:2021-02-20 15:48:12 【问题描述】:我正在使用第 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;
【问题讨论】:
我认为没有人可以在不查看您的代码的情况下为您提供帮助,请尝试在问题中添加一些您目前拥有的代码。 感谢您的反馈,我插入了一部分代码@TamirAbutbul 【参考方案1】:调用adapter.notifyDataSetChanged()
将使recyclerview 重新加载,然后你的项目应该调整。
关于滚动(复制),请看这里:Scroll RecyclerView to show selected item on top
【讨论】:
不,我不认为这是答案,我只需要在回收站视图的第一项发生变化时滚动到第一个位置。我不需要调用 adapter.notifyDataSetChanged() 因为分页库会处理。以上是关于如何找出分页数据适配器中的第一项已更改的主要内容,如果未能解决你的问题,请参考以下文章
在listview中的addTextChangedListener中使用自定义列表适配器