美文网首页
RecyclerView中item条目上下交换位置和左滑删除it

RecyclerView中item条目上下交换位置和左滑删除it

作者: 总会颠沛流离 | 来源:发表于2019-07-20 09:19 被阅读0次

效果图:


image.png
image.png

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);
}

相关文章

网友评论

      本文标题:RecyclerView中item条目上下交换位置和左滑删除it

      本文链接:https://www.haomeiwen.com/subject/iarylctx.html