ItemTouchHelper - 在第一条跳线后强制放下
ItemTouchHelper - The drop is forced after the first jumped line
我正在使用 ItemTouchHelper 和 ItemTouchHelper.SimpleCallback 以允许用户重新排序垂直列表 Recycler View。
拖放有效,但在第一条跳线后强制拖放,即使我的手指没有离开被拖拽的单元格。
请在下面找到 SimpleCallback :
private void initSwipeAndDrap() {
ItemTouchHelper.SimpleCallback simpleItemTouchCallback =
new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP | ItemTouchHelper.DOWN,
0) {
//========== Swipe (Not used) ==============
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
//========== Drag ==============
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
Podcast podcast = rva.podcasts.remove(fromPosition);
rva.podcasts.add(toPosition, podcast);
act.dmo.updatePodcastsListPosition();
act.dmo.notifyDataSetChangedPodcast();
return true;
}
@Override
public boolean isLongPressDragEnabled() {
return false;
}
};
itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(rv);
}
在 onMove() 方法中用 notifyItemMoved() 替换 notifyDataSetChanged() 解决了我的问题。
这让我很吃惊,因为我认为 onMove() 是在下降之后被调用的。事实上,它对掉落本身有影响。
对于那些在移动元素时遇到对齐问题的用户,如果您正在使用此覆盖
@Override
public int getItemViewType(int position) {
return position;
}
只需将其从您的适配器中删除即可正常工作
当我将回收器与视图寻呼机和约束布局一起使用时,我遇到了类似的问题。我尝试了这些回复,但唯一对我有帮助的是设置:
viewBinding.recycler.setHasFixedSize(true)
这使得将视图从回收器的一端拖动到另一端成为可能。没有它,滚动期间每次拖动都会中断。
多亏了 post,我得到了这个解决方案。
我正在使用 ItemTouchHelper 和 ItemTouchHelper.SimpleCallback 以允许用户重新排序垂直列表 Recycler View。
拖放有效,但在第一条跳线后强制拖放,即使我的手指没有离开被拖拽的单元格。
请在下面找到 SimpleCallback :
private void initSwipeAndDrap() {
ItemTouchHelper.SimpleCallback simpleItemTouchCallback =
new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP | ItemTouchHelper.DOWN,
0) {
//========== Swipe (Not used) ==============
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
//========== Drag ==============
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
Podcast podcast = rva.podcasts.remove(fromPosition);
rva.podcasts.add(toPosition, podcast);
act.dmo.updatePodcastsListPosition();
act.dmo.notifyDataSetChangedPodcast();
return true;
}
@Override
public boolean isLongPressDragEnabled() {
return false;
}
};
itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(rv);
}
在 onMove() 方法中用 notifyItemMoved() 替换 notifyDataSetChanged() 解决了我的问题。
这让我很吃惊,因为我认为 onMove() 是在下降之后被调用的。事实上,它对掉落本身有影响。
对于那些在移动元素时遇到对齐问题的用户,如果您正在使用此覆盖
@Override
public int getItemViewType(int position) {
return position;
}
只需将其从您的适配器中删除即可正常工作
当我将回收器与视图寻呼机和约束布局一起使用时,我遇到了类似的问题。我尝试了这些回复,但唯一对我有帮助的是设置:
viewBinding.recycler.setHasFixedSize(true)
这使得将视图从回收器的一端拖动到另一端成为可能。没有它,滚动期间每次拖动都会中断。
多亏了