Android-WItemTouchHelperPlus幾行代碼搞定仿QQ側滑

一 前言

側滑對於Android來講實現方式多種多樣,可是具體那種方式能知足咱們的需求和適用場景那就很難說了,曾試過繼承RecyclerView,自定義Adapter等方法,可是效果並非很理想.最終定製版的WItemTouchHelperPlus符合了大部分的側滑需求,它來自系統類的改造.下面來看下實現的效果.
java

仿qq的側滑,跟隨滑動...

簡單的側滑點擊刪除,覆蓋滑動...

二 知識準備

ItemTouchHelper是Android系統提供的一個幫助類,能夠很輕鬆的用它實現長按拖拽和側滑刪除功能(這裏的是側滑以後直接刪除整條Item),下面來看一下使用方法.android

  • ItemTouchHelper.Callback
    官方的解釋是這樣的,這個類是ItemTouchHelper和您的應用程序之間的契約。它容許您控制每一個ViewHolder都啓用了哪些觸摸行爲,而且在user執行這些操做時也會接收回調 .通俗來講就是咱們能夠再這個類裏面去控制咱們想要的觸摸效果,也就是側滑仍是拖拽.而後能夠獲得動做執行中的回調,和動做執行結束後的回調.

咱們須要繼承ItemTouchHelper.Callback來實現本身的邏輯.我先大體的介紹一下具體的使用方法,詳情還請自行查資料.請看代碼:git

/**
 * 實現本身的邏輯
 * 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);

複製代碼

下面是我目前發現的系統的ItemTouchHelper的一些弊端和好處:
github

弊端:json

  • 當處於滑動狀態的時候不下發點擊事件.
  • 滑動的距離爲RecyclerView的寬度,每每就是屏幕的寬度.
  • 限制滑動距離以後,沒法正常恢復側滑(讓滑動的View復位).
  • 當Item手動滑動以後不能自由的自動的恢復側滑(讓滑動的View復位).
  • 沒法作到特定的Item不讓側滑.
  • 總問言之側滑不流暢.

好處:bash

  • 側滑佈局的樣式咱們能夠隨意的更改.
  • 滑動的距離能夠隨意的固定.
  • 側滑恢復的動畫咱們能夠控制.
  • 總而言之給了開發者很大的自由.

三 改進版的WItemTouchHelperPlus

  • 新增了一個接口Extension用來獲取咱們側滑的距離,須要在獲取側滑控件的地方去實現該接口,由於再ItemTouchHelper裏面咱們操做的是ViewHolder,因此咱們的ViewHiolder是實現它的最好選擇了.代碼以下:
//接口
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來實現側滑.基本使用和系統類別無差別.源碼至關多,這裏就再也不貼出具體能夠去Github歡迎startapp

結束

這裏只是大概的介紹了一下定製版WItemTouchHelperPlus和系統類的一些不一樣,以及定製版的一些用法,但願你們多多指導文章中出現的錯誤,歡迎你們的反饋,歡迎評論吐槽哦~
ide

若是你們須要WItemTouchHelperPlus或者系統類ItemTouchHelper的源碼解釋的話請評論區留言哦~ 謝謝各位看官!
歡迎你們關注
個人掘金
個人CSDN
個人簡書
Github
佈局

Demo地址,歡迎start動畫

APK下載

相關文章
相關標籤/搜索