RecycleView Itemmove 不替换item位置,而是将item插入整体item后移
时间: 2024-01-18 19:02:50 浏览: 24
如果您想要在 RecycleView 中实现 ItemMove 操作并将 Item 插入到整体 Item 之后移动,可以尝试以下步骤:
1. 实现 ItemTouchHelper.Callback 接口,在其中重写 onMove 和 onSwiped 方法,分别处理 Item 移动和删除操作。
2. 在 onMove 方法中,获取被拖拽的 Item 的位置和目标位置,然后将该 Item 从原位置移除,再将其插入到目标位置。
3. 在插入 Item 之后,您需要重新计算整个列表中所有 Item 的位置,确保它们按照正确的顺序排列。
下面是一个示例代码,供参考:
```java
public class ItemMoveCallback extends ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter mAdapter;
public ItemMoveCallback(ItemTouchHelperAdapter adapter) {
mAdapter = adapter;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
mAdapter.onItemMove(fromPosition, toPosition);
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// do nothing
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if (viewHolder instanceof ItemTouchHelperViewHolder) {
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemClear();
}
}
}
```
在 Adapter 中实现 ItemTouchHelperAdapter 接口:
```java
public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
}
```
然后在 Adapter 中实现 onItemMove 方法:
```java
@Override
public void onItemMove(int fromPosition, int toPosition) {
// 将 fromPosition 对应的 Item 移除
MyItem item = mItems.remove(fromPosition);
// 将 Item 插入到 toPosition 之后
mItems.add(toPosition + 1, item);
// 重新计算所有 Item 的位置
notifyItemMoved(fromPosition, toPosition + 1);
for (int i = 0; i < getItemCount(); i++) {
MyItem item = mItems.get(i);
item.setPosition(i);
}
}
```
在上述示例代码中,当用户将一个 Item 拖拽到另一个位置时,会调用 onMove 方法,并在该方法中将该 Item 移动到目标位置之后。然后,我们需要调用 notifyItemMoved 方法通知 Adapter 该 Item 的位置已经发生了变化,并重新计算所有 Item 的位置。最后,我们需要更新每个 Item 的位置属性,以确保它们按照正确的顺序排列。