我使用GridLayoutManager将RecyclerView设置为spanCount设置为2。 我正在使用ItemTouchHelper.Callback实现来处理拖放操作,以允许用户彼此交换两个元素。
我正在设置移动标志,如下所示:
@Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0;
int swipeFlags = 0;
if (view.getSelectedItemId() == R.id.bottom_video_menu_one_cam) {
swipeFlags |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
dragFlags |= ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
}
return makeMovementFlags(dragFlags, swipeFlags);
}
当onMove方法触发我的回调时,我正在使用以下代码交换两个元素:
@Override public void onItemMoved(int oldPosition, int newPosition) {
Collections.swap(cameras, oldPosition, newPosition);
notifyItemMoved(oldPosition, newPosition);
}
如果我在网格中将“ A1”项与“ A2”项交换,则一切正常:
交换之前:
A1 A2
B1 B2
=== 用A2交换A1 ===
交换后:
A2 A1
B1 B2
在行之间交换时,我试图实现以下逻辑:
交换之前:
A1 A2
B1 B2
=== 用B1交换A1 ===
交换后的预期结果:
B1 A2
A1 B2
但不是整个网格都重新排列,而是变为:
A2 B1
A1 B2
在交换网格中的元素时,是否有任何方法\属性可以保持其他视图位置不变?