在 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中将最新项目标记为“新”?
将回收站视图数据中的 onMove() 更改更新到房间数据库