利用draganddrop 将外部view拖拽进入recycleview
时间: 2023-09-12 16:08:01 浏览: 151
要实现这个功能,你需要实现以下几个步骤:
1. 在 Recycleview 的 item layout 中添加一个可接受拖放的 View。
2. 在外部 View 上注册一个拖放监听器。
3. 在拖放监听器中实现 onDrag() 方法,用于创建一个拖放阴影,并将其与拖放事件绑定。
4. 在 onDrag() 方法中,你需要将拖放事件传递给 Recycleview 的 ItemTouchHelper 对象。
5. 在 ItemTouchHelper.Callback 的实现中,你需要实现 onMove() 方法,将外部 View 拖放到 Recycleview 中的指定位置,并更新数据集合。
6. 最后,你需要调用 notifyItemInserted() 方法来刷新 Recycleview 的显示。
下面是一个大致的实现方案:
```
class MyAdapter extends RecyclerView.Adapter<MyViewHolder> implements ItemTouchHelper.Callback {
List<Item> mData;
// ...
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 创建 ViewHolder 对象,并将其绑定到一个 item layout 上。
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
// 在 item layout 中添加一个可接受拖放的 View。
View dropView = itemView.findViewById(R.id.drop_view);
// 注册拖放监听器。
dropView.setOnDragListener(new MyDragListener());
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 将数据绑定到 ViewHolder 上。
}
// ...
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// 将外部 View 拖放到 Recycleview 中的指定位置,并更新数据集合。
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
Collections.swap(mData, fromPosition, toPosition);
// 刷新 Recycleview 的显示。
notifyItemMoved(fromPosition, toPosition);
return true;
}
// ...
}
class MyDragListener implements View.OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
// 创建一个拖放阴影,并将其与拖放事件绑定。
View shadowView = v;
ClipData clipData = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(shadowView);
v.startDrag(clipData, shadowBuilder, v, 0);
// 将拖放事件传递给 ItemTouchHelper 对象。
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyAdapter());
itemTouchHelper.startDrag(event);
return true;
}
}
```
需要注意的是,以上代码仅供参考,具体实现方式可能会因为业务需求而有所不同。
阅读全文