下面是关于“Android中RecyclerView拖拽、侧删功能的实现代码”的完整攻略。
RecyclerView基础
在介绍实现RecyclerView拖拽、侧删功能之前,先简单介绍一下RecyclerView的基础知识。
RecyclerView是Android提供的新的可复用列表控件,使用了一个LayoutManager来管理Item的样式,数据由Adapter提供。其与ListView的不同之处在于:
- RecyclerView可以实现多种布局效果;
- 和ListView相比,它更加灵活,可扩展性更强;
- 与ListView相比,它更易于实现Item间动画效果。
RecyclerView的基础用法类似于ListView,只是需要提供一个自定义的Adapter并实现自定义ViewHolder。RecyclerView处理Item点击以及长按事件时,需要设置一个ItemClickListener以及ItemLongClickListener。代码如下:
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new MyAdapter(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
recyclerView.addOnItemTouchListener(new OnItemClickListener(recyclerView) {
@Override
public void onItemClick(RecyclerView.ViewHolder viewHolder) {
//处理Item点击事件
}
@Override
public void onItemLongClick(RecyclerView.ViewHolder viewHolder) {
//处理Item长按事件
}
});
实现拖拽功能
RecyclerView提供了ItemTouchHelper类来支持拖拽和滑动删除等交互操作。
- 首先,创建一个ItemTouchHelper.Callback实例,通过实现其中的dragFlags和swipeFlags方法,设置支持哪些动作(拖拽、侧滑)以及方向(上、下、左、右等);
- 接着,调用ItemTouchHelper的attachToRecyclerView方法将其附加到RecyclerView上;
- 最后,需要在Adapter中实现onMove和onSwiped方法,来告诉ItemTouchHelper,在拖拽或侧滑时应该如何处理数据。
下面是一个简单的示例代码:
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
/**
* 设置支持哪些动作(拖拽、侧滑)以及方向(上、下、左、右等)
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//设置拖拽方向为上下
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//设置删除方向为右
int swipeFlags = ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, swipeFlags);
}
/**
* 拖拽时调用
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//交换数据
mAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
/**
* 侧滑删除时调用
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//删除数据
mAdapter.remove(viewHolder.getAdapterPosition());
}
});
//将itemTouchHelper附加到RecyclerView上
itemTouchHelper.attachToRecyclerView(recyclerView);
实现侧滑删除功能
RecyclerView默认并不支持侧滑删除,需要通过ItemTouchHelper来实现。
- 在ItemTouchHelper.Callback的getMovementFlags方法中,设置Item侧滑的方向和方案;
- 在ItemTouchHelper.Callback的onSwiped方法中,处理Item侧滑之后的逻辑。
下面是一个示例代码:
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//只设置支持左右方向的Swipe
return makeMovementFlags(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();//获取swipe当前的item项position位置
if(direction == ItemTouchHelper.LEFT){//向左侧滑删除,类似交互中竖直方向上的拖拽
mAdapter.notifyItemRemoved(position);//adapter中对RecyclerView数据进行了删除操作
mAdapter.itemList.remove(position);//从数据源中remove
mAdapter.notifyItemRangeChanged(position,mAdapter.itemList.size()-position);//刷新被删除位置左侧的position
Snackbar.make(viewHolder.itemView,"删除了第"+(position+1)+"个Item",Snackbar.LENGTH_LONG).setAction("撤销", new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.itemList.add(position,bean);//在数据源中添加被删除的数据
mAdapter.notifyItemInserted(position);//在RecyclerView中添加被删除的item的数据
mAdapter.notifyItemRangeChanged(position,mAdapter.getItemCount()-position);//刷新被删除位置左侧的position
}
}).show();
}
}
至此,我们通过简单的示例讲解了如何实现RecyclerView拖拽、侧删功能的相关代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中RecyclerView拖拽、侧删功能的实现代码 - Python技术站