实现RecyclerView中item条目上下交换位置和左滑删除
2019-05-04 本文已影响0人
清风兑酒
移动条目
1、TouchCallBack接口
public interface TouchCallBack {
//交换条目位置
void onItemMove(int fromPosition,int toPosition);
//删除条目
void onItemDelete(int position);
}
2、SimpleItemTouchCallBack类
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
public class SimpleItemTouchCallBack extends ItemTouchHelper.Callback{
private TouchCallBack mCallBack;
//左滑删除的
private boolean mSwipeEnable = true;
public SimpleItemTouchCallBack(TouchCallBack mCallBack) {
this.mCallBack = mCallBack;
}
/**
* 返回可以滑动的方向,一般使用makeMovementFlags(int,int)
* 或makeFlag(int, int)来构造我们的返回值
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//允许上下拖拽
int drag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//允许向左滑动
int swipe = ItemTouchHelper.LEFT;
//设置
return makeMovementFlags(drag,swipe);
}
/**
* 上下拖动item时回调,可以调用Adapter的notifyItemMoved方法来交换两个ViewHolder的位置,
* 最后返回true,
* 表示被拖动的ViewHolder已经移动到了目的位置
* @param recyclerView
* @param viewHolder
* @param target
* @return
*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
//通知适配器,两个子条目位置发生改变
mCallBack.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
/**
* 当用户左右滑动item时达到删除条件就会调用,一般为一半,条目继续滑动删除,否则弹回
* @param viewHolder
* @param direction
*/
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
mCallBack.onItemDelete(viewHolder.getAdapterPosition());
}
/**
* 支持长按拖动,默认是true
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();
}
/**
* 支持滑动,即可以调用到onSwiped()方法,默认是true
* @return
*/
@Override
public boolean isItemViewSwipeEnabled() {
return mSwipeEnable;
}
/**
* 设置是否支持左滑删除
* @param enable
*/
public void setmSwipeEnable(boolean enable) {
this.mSwipeEnable = enable;
}
}
3.在Activity中
/**
* homeSpecialRecyclerViewAdapter RecyclerView 的适配器
* recyclerview RecyclerView 控件
*/
// 拖拽移动和左滑删除
SimpleItemTouchCallBack simpleItemTouchCallBack = new SimpleItemTouchCallBack(homeSpecialRecyclerViewAdapter);
// 要实现侧滑删除条目,把 false 改成 true 就可以了
simpleItemTouchCallBack.setmSwipeEnable(false);
ItemTouchHelper helper = new ItemTouchHelper(simpleItemTouchCallBack);
helper.attachToRecyclerView(recyclerview);
4、使 RecyclerView 的适配器实现 TouchCallBack 接口
/**
* goldTitleBeans 适配器里的数据集合
*/
@Override
public void onItemMove(int fromPosition, int toPosition) {
//交换集合中两个数据的位置
Collections.swap(goldTitleBeans,fromPosition,toPosition);
//刷新界面,局部刷新,索引会混乱
notifyItemMoved(fromPosition,toPosition);
}
@Override
public void onItemDelete(int position) {
goldTitleBeans.remove(position);
//局部刷新,索引会混乱+集合越界
notifyItemRemoved(position);
}