DragDrop 和使用 RecyclerView 滑動

你可以使用 RecyclerView 實現滑動到關閉和拖放功能,而無需使用第三方庫。
只需使用 RecyclerView 支援庫中包含的 ItemTouchHelper 類。

使用 SimpleCallback 回撥例項化 ItemTouchHelper,根據你支援的功能,你應該覆蓋 onMove(RecyclerView, ViewHolder, ViewHolder) 和/或 onSwiped(ViewHolder, int) 並最終附加到你的 RecyclerView

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
        // remove item from adapter
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            final int fromPos = viewHolder.getAdapterPosition();
            final int toPos = target.getAdapterPosition();
            // move item in `fromPos` to `toPos` in adapter.
            return true;// true if moved, false otherwise
        }
    
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);

值得一提的是,SimpleCallback 建構函式將相同的滑動策略應用於 RecyclerView 中的所有專案。在任何情況下都可以通過簡單地覆蓋方法 getSwipeDirs(RecyclerView, ViewHolder) 來更新特定專案的預設滑動方向。

讓我們假設我們的 RecyclerView 包含了一個 HeaderViewHolder,我們顯然不想對它進行滑動。覆蓋 getSwipeDirs 就足夠了,如下所示:

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder instanceof HeaderViewHolder) {
        // no swipe for header
        return 0;
    }
    // default swipe for all other items
    return super.getSwipeDirs(recyclerView, viewHolder);
}