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