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

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() 因为分页库会处理。

以上是关于如何找出分页数据适配器中的第一项已更改的主要内容,如果未能解决你的问题,请参考以下文章

如何通知 List 组件一项已更改大小?

在listview中的addTextChangedListener中使用自定义列表适配器

如何确定图像是在 Android 的适配器中单击

列表项已从 ListView 中删除,但未从数据库中删除

如何从 Sqlite ( android ) 中的 datetime 字段获取日期

提交新的分页数据时如何清除适配器?