拖拽移动RecyclerView

博客移动到个人站点:http://www.wangchengmeng.club/2018/02/01/%E6%8B%96%E6%8B%BD%E7%A7%BB%E5%8A%A8RecyclerView/

欢迎来吐槽

先上效果

List效果

自由拖拽的List和Grid(ps:样子有点丑,但是功能很需要)。

ItemTouchHelper,对,就是它。

1.定一个callback类,并实现ItemTouchHelper.Callback,处理移动拖拽:

构造函数:传入数据载体adapter,方便拖拽时对数据的处理

 private MainCouponAdapter mMainCouponAdapter;
public ItemTouchHelperCallback2(MainCouponAdapter adapter) {
    mMainCouponAdapter = adapter;
}

 /**
 * isLongPressDragEnabled返回的是一个boolean值
 * ,当boolean值为true时,
 * 下面的makeMovementFlags方法的dragFlags值才会起效,
 * 它具有上下拖动作用,返回false时则没有任何效果。
 */
@Override
public boolean isLongPressDragEnabled() {
    //长按拖动
    return true;
}

 /**
 * isItemViewSwipeEnabled返回的也是一个boolean值
 * 它和isLongPressDragEnabled类似。不同的是它控制的是左右滑动效果。
 */
@Override
public boolean isItemViewSwipeEnabled() {
    return true;
}

 /**
 * getMovementFlags方法返回的是一个int值,这个int值主要是makeMovementFlags(int
 * dragFlags, int swipeFlags)方法返回的int值,其中makeMovementFlags需要传递两个参数dragFlags和swipeFlags。
 * dragFlags和swipeFlags是通过下面几种方式结合
 * <p>
 * ItemTouchHelper.UP | ItemTouchHelper.DOWN
 * ItemTouchHelper.START | ItemTouchHelper.END
 * ItemTouchHelper.UP | ItemTouchHelper.DOWN|ItemTouchHelper.START | ItemTouchHelper.END
 * <p>
 * 如果我们不需要其中一个方向的效果,那么参数直接传0值就行了。
 */
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlags;
    int swipeFlags = 0;
    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
    if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
        dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END;
    } else {
        dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
    }
    return makeMovementFlags(dragFlags, swipeFlags);

}


 /**
 * onMove方法,主要是拖动的时候,可以在这里监听进行数据更新的操作
 * onSwiped方法,主要是相邻的item进行数据交换的数据更新。
 * onSelectedChanged和clearView主要是长按操作对象可以进行一些操作,比如放大缩小操作。
 */

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

// if (viewHolder.getAdapterPosition() == 0)
// 第一个item可以拖动但是位置不变
// return false;
// }
mMainCouponAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    mMainCouponAdapter.onItemDismiss(viewHolder.getAdapterPosition());//自己adapter中实现该方法并自定义数据处理
}

2.定义接口 ItemTouchHelperAdapter并声明两方法,

 //处理滑动消失item
public void onItemDismiss(int position);

//处理拖拽移动的item
public void onItemMove(int from, int to);

3.定义数据载体adapter类并实现ItemTouchHelperAdapter接口

主要代码:实现接口方法

 @Override
public void onItemDismiss(int position) {
    //滑动删除
    mStringList.remove(position);
    Toast.makeText(mActivity, "删除了", Toast.LENGTH_SHORT).show();
    notifyItemRemoved(position);
}

//mStringList数据载体list
@Override
public void onItemMove(int from, int to) {
//移动
Collections.swap(mStringList, from, to);
notifyItemMoved(from, to);
}

不改变RecyclerView以及adapter任何写法,只需要添加以下代码:

    ItemTouchHelperCallback2 callback =
            new ItemTouchHelperCallback2(mainCouponAdapter);
    ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
    touchHelper.attachToRecyclerView(mRecyclerView);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值