一 前言
側滑對于Android來說實現(xiàn)方式多種多樣,但是具體那種方式能滿足我們的需求和適用場景那就很難說了,曾試過繼承RecyclerView,自定義Adapter等方法,但是效果并不是很理想.最終定制版的WItemTouchHelperPlus符合了大部分的側滑需求,它來自系統(tǒng)類的改造.下面來看下實現(xiàn)的效果.
仿qq的側滑,跟隨滑動...
簡單的側滑點擊刪除,覆蓋滑動...
二 知識準備
ItemTouchHelper是Android系統(tǒng)提供的一個幫助類,可以很輕松的用它實現(xiàn)長按拖拽和側滑刪除功能(這里的是側滑之后直接刪除整條Item),下面來看一下使用方法.
- ItemTouchHelper.Callback
官方的解釋是這樣的,這個類是ItemTouchHelper和您的應用程序之間的契約。它允許您控制每個ViewHolder都啟用了哪些觸摸行為浑彰,并且在user執(zhí)行這些操作時也會接收回調(diào) .通俗來說就是我們可以再這個類里面去控制我們想要的觸摸效果,也就是側滑還是拖拽.然后可以得到動作執(zhí)行中的回調(diào),和動作執(zhí)行結束后的回調(diào).
我們需要繼承ItemTouchHelper.Callback來實現(xiàn)自己的邏輯.我先大致的介紹一下具體的使用方法,詳情還請自行查資料.請看代碼:
/**
* 實現(xiàn)自己的邏輯
* Created by WANG on 18/3/14.
*/
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
//是否支持側滑
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return makeMovementFlags(0, ItemTouchHelper.START);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
return;
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
}
}
//這里給RecyclerView設置一下就OK拉
ItemTouchHelperCallback touchHelperCallback = new ItemTouchHelperCallback();
ItemTouchHelper itemTouchHelper=newItemTouchHelper(touchHelperCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
下面是我目前發(fā)現(xiàn)的系統(tǒng)的ItemTouchHelper的一些弊端和好處:
弊端:
- 當處于滑動狀態(tài)的時候不下發(fā)點擊事件.
- 滑動的距離為RecyclerView的寬度,往往就是屏幕的寬度.
- 限制滑動距離之后,無法正常恢復側滑(讓滑動的View復位).
- 當Item手動滑動之后不能自由的自動的恢復側滑(讓滑動的View復位).
- 無法做到特定的Item不讓側滑.
- 總問言之側滑不流暢.
好處:
- 側滑布局的樣式我們可以隨意的更改.
- 滑動的距離可以隨意的固定.
- 側滑恢復的動畫我們可以控制.
- 總而言之給了開發(fā)者很大的自由.
三 改進版的WItemTouchHelperPlus
- 新增了一個接口Extension用來獲取我們側滑的距離,需要在獲取側滑控件的地方去實現(xiàn)該接口,因為再ItemTouchHelper里面我們操作的是ViewHolder,所以我們的ViewHiolder是實現(xiàn)它的最好選擇了代碼如下:
//接口
public interface Extension {
float getActionWidth();
}
**********************Viewholder***********************
/**
* view.getWidth()獲取的是屏幕中可以看到的大小.
*/
public class RecViewholder extends RecyclerView.ViewHolder implements Extension {
public TextView textView;
public TextView slide;
public RecViewholder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.item_text);
slide = itemView.findViewById(R.id.item_slide);
}
@Override
public float getActionWidth() {
return slide.getWidth();
}
}
- 新增了tag.需要在我們滑動的xml布局里面設置一個tag="slide_flag",用來標識該布局為側滑滑動的布局用例:
//這個標識的布局就是我們能滑動的布局.
<TextView
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#e1e1e1"
android:gravity="center"
android:tag="slide_flag"
android:text="item"
android:textColor="#333333"
android:textSize="16sp" />
- WItemTouchHelperPlus.Callback需要重寫getItemSlideType方法返我們側滑的布局類型,就是文章開始處的跟隨GIF和覆蓋GIF兩種側滑布局.
@Override
public String getItemSlideType() {
return type;
}
- 再onChildDraw里面做一些處理.
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (viewHolder instanceof RecAdapter.RecViewholder) {
RecAdapter.RecViewholder holder = (RecAdapter.RecViewholder) viewHolder;
float actionWidth = holder.getActionWidth();
if (dX < -actionWidth) {
dX = -actionWidth;
}
holder.slideItem.setTranslationX(dX);
}else if(viewHolder instanceof RecOtherTypeAdapter.RecViewholder){
RecOtherTypeAdapter.RecViewholder holder = (RecOtherTypeAdapter.RecViewholder) viewHolder;
float actionWidth = holder.getActionWidth();
if (dX < -actionWidth) {
dX = -actionWidth;
}
holder.textView.setTranslationX(dX);
}
return;
}
然后就是使用我們改進版的WItemTouchHelperPlus.Callback和WItemTouchHelperPlus來實現(xiàn)側滑.基本使用和系統(tǒng)類別無差異.源碼相當多,這里就不再貼出具體可以去Github歡迎start
結束
這里只是大概的介紹了一下定制版WItemTouchHelperPlus和系統(tǒng)類的一些不同,以及定制版的一些用法,希望大家多多指導文章中出現(xiàn)的錯誤,歡迎大家的反饋,歡迎評論吐槽哦~
如果大家需要WItemTouchHelperPlus或者系統(tǒng)類ItemTouchHelper的源碼解釋的話請評論區(qū)留言哦~ 謝謝各位看官!
歡迎大家關注
我的掘金
我的CSDN
我的簡書
Github