1. 程式人生 > >Android開發之ItemTouchHelper解析

Android開發之ItemTouchHelper解析

擼這篇部落格只是因為下篇部落格卡片分析開源庫所需,無他為學習爾

RecyclerView的Item可上線左右拖拽,實現起來也比較簡單,這裡需要用到ItemTouchHelper.Callback類


public abstract static class Callback {

        @Override
        public boolean isItemViewSwipeEnabled() {
            return true;
        }

        @Override
        public boolean isLongPressDragEnabled
() { return true; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //TODO int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return
makeMovementFlags(dragFlags, swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //TODO return false
; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //TODO } }

重寫getMovementFlags()方法設定拖放和滑動的方向。使用ItemTouchHelper.makeMovementFlags(int, int)來構造返回的flag。支援長按RecyclerView item進入拖動操作,你必須在isLongPressDragEnabled()方法中返回true,在view任意位置觸控時啟用滑動操作isItemViewSwipeEnabled()方法中返回true

        @Override
        public boolean isLongPressDragEnabled() {
            return true;
        }

        @Override
        public boolean isItemViewSwipeEnabled() {
            return true;
        }

onSwiped、onMove函式回撥,adapter做相應的資料處理,並呼叫notifyItemRemoved()和 notifyItemMoved()各自對應函式更新UI.這裡補充一個基礎知識點:

//把集合內的元素進行位置交換
Collections.swap(list,i,j)

最後利用ItemTouchHeper把Callback繫結到RecyclerView就ok了,這樣一個簡單地上下拖拽左右滑動刪除就實現了.

        ItemTouchHelper.Callback callback =
                new SimpleItemTouchHelperCallback();
        ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
        touchHelper.attachToRecyclerView(recyclerView);

之前發現一篇app端圖文混排編輯器相關的Blog地址如下

當你瞭解ItemTouchHelper.Callback使用後你有沒有覺得如此簡單呢?

我們常用的QQ訊息列表,支援左右滑動彈出刪除、置頂相關UI,以前的實現方案都是SwipeMenu之類的開源庫來實現,現在用ItemTouchHelper輔助實現更簡單了,滑動刪除邏輯修改判斷值getWidth/2改為刪除、置頂等功能的parent.getWidth/2,Item的滑動刪除動畫是針對的整個View,要實現QQ的滑動刪除效果,我們需要的是內容偏移,這樣底部的刪除置頂功能就出來了。

RecyclerView 在Touch的時候需要取消每個Item的刪除顯示,防止複用誤差問題。

最後在推薦一個開源庫,可以更好地幫助你理解ItemTouchHelper、Callback