安卓将view拖拽进入recycleview示例代码
时间: 2023-09-12 19:06:36 浏览: 43
这里是一个示例代码,演示如何将一个 View 拖拽进入 RecyclerView 中:
1. 首先,在布局文件中定义 RecyclerView:
```
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
2. 在 Activity 或 Fragment 中获取 RecyclerView 实例,并设置其布局管理器:
```
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
```
3. 创建一个自定义的 RecyclerView.Adapter 类,用于管理数据集合,并将数据绑定到 View 上:
```
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<String> mData;
public MyAdapter(List<String> data) {
mData = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_view, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
String data = mData.get(position);
holder.mTextView.setText(data);
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text_view);
}
}
}
```
4. 在 Activity 或 Fragment 中创建一个 Adapter 实例,并将其设置为 RecyclerView 的适配器:
```
List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3");
MyAdapter adapter = new MyAdapter(data);
recyclerView.setAdapter(adapter);
```
5. 实现 ItemTouchHelper.Callback 接口,用于处理拖拽和滑动事件:
```
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter mAdapter;
public MyItemTouchHelperCallback(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) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// 不处理滑动事件
}
}
```
6. 创建一个 ItemTouchHelperAdapter 接口,用于处理拖拽事件:
```
public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
}
```
7. 在 Adapter 类中实现 ItemTouchHelperAdapter 接口:
```
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
implements ItemTouchHelperAdapter {
private List<String> mData;
public MyAdapter(List<String> data) {
mData = data;
}
// 省略 onCreateViewHolder 和 onBindViewHolder 方法
@Override
public int getItemCount() {
return mData.size();
}
@Override
public void onItemMove(int fromPosition, int toPosition) {
// 处理拖拽事件
String data = mData.remove(fromPosition);
mData.add(toPosition, data);
notifyItemMoved(fromPosition, toPosition);
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text_view);
}
}
}
```
8. 在 Activity 或 Fragment 中创建一个 ItemTouchHelper 实例,并将其附加到 RecyclerView 上:
```
ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback(adapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerView);
```
9. 如果需要在拖拽的过程中显示一个提示,可以在 MyViewHolder 中添加一个 View,并在 onItemSelected 和 onItemClear 方法中修改其可见性:
```
public static class MyViewHolder extends RecyclerView.ViewHolder
implements ItemTouchHelperViewHolder {
public TextView mTextView;
public View mDragHandle;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text_view);
mDragHandle = itemView.findViewById(R.id.drag_handle);
}
@Override
public void onItemSelected() {
mDragHandle.setVisibility(View.VISIBLE);
}
@Override
public void onItemClear() {
mDragHandle.setVisibility(View.GONE);
}
}
```
10. 最后,在布局文件中为 MyViewHolder 添加一个拖拽手柄:
```
<ImageView
android:id="@+id/drag_handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_drag_handle"
android:visibility="gone" />
```