在 Android 回收站视图中重新排序项目后,位置未更新

Posted

技术标签:

【中文标题】在 Android 回收站视图中重新排序项目后,位置未更新【英文标题】:After reordering the items in Android recycler view the position is not updating 【发布时间】:2021-12-30 18:39:02 【问题描述】:

在我的应用程序中,我在回收站视图中显示按钮列表,在 ItemTouchHelper.SimpleCallback 的帮助下,onMove 函数我能够重新排序按钮,但重新排序后位置没有更新。例如:-(如果我将 button1 从 0 位置拖到 1 位置,那么 button1 应该显示它的新位置是 1,但它显示的是旧位置,即 0)是否有任何变化,以便 我可以访问它并了解我的按钮的新位置。 任何帮助将不胜感激。

ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP
                | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END , 0) 
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) 
    
                int fromPosition = viewHolder.getAdapterPosition();
                int toPosition = target.getAdapterPosition();
    
                Collections.swap(datalist,fromPosition,toPosition);
    
                recyclerView.getAdapter().notifyItemMoved(fromPosition,toPosition);
                return false;
            
    
    
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) 
    
            
        ;

【问题讨论】:

【参考方案1】:

这应该根据视图的新位置更新视图。这是项目更改事件,而不是结构更改事件。它表明位置数据的任何反映都是过时的,应该更新。

  recyclerView.getAdapter().notifyDataSetChanged();

【讨论】:

我认为你有这个倒退。这是一个结构性变化事件。请参阅notifiyDataSetChanged 上的文档:“结构变化是指在数据集中插入、删除或移动项目。”该文档还建议在适用时使用notifyItemRangeChanged。这样可以避免重新绑定所有内容。【参考方案2】:

我通过通知适配器中的整个数据集解决了这个问题:

Collections.swap(datalist,fromPosition,toPosition);
recyclerView.getAdapter().notifyItemMoved(fromPosition,toPosition);
recyclerView.getAdapter().notifyDataSetChanged()
return false;

【讨论】:

以上是关于在 Android 回收站视图中重新排序项目后,位置未更新的主要内容,如果未能解决你的问题,请参考以下文章

回收站视图仅在我从房间数据库中删除后重新打开活动时更新

如何在android的recyclerview中将最新项目标记为“新”?

Android:刷卡后点击在回收站项目上不起​​作用

将回收站视图数据中的 onMove() 更改更新到房间数据库

回收站视图未在 Fragment (Android) 上显示项目

每次重新创建滚动位置后,如何将滚动位置保存在回收站视图中?