拖拽移動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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章