Android側滑-RecyclerView實現(xiàn)簡單高效的側滑菜單

一 前言

側滑對于Android來說實現(xiàn)方式多種多樣,但是具體那種方式能滿足我們的需求和適用場景那就很難說了,曾試過繼承RecyclerView,自定義Adapter等方法,但是效果并不是很理想.最終定制版的WItemTouchHelperPlus符合了大部分的側滑需求,它來自系統(tǒng)類的改造.下面來看下實現(xiàn)的效果.

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

image

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

image

二 知識準備

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

Demo地址,歡迎start

為了能夠及時解決使用者的問題殉挽,特地建了一個Android技術交流群丰涉,遇到問題或者需求可以扔到群里,群里大神妹紙多的是~

先加入QQ群 684891631 再轉微信群~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斯碌,一起剝皮案震驚了整個濱河市一死,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傻唾,老刑警劉巖投慈,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冠骄,居然都是意外死亡伪煤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門猴抹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來带族,“玉大人锁荔,你說我怎么就攤上這事蟀给。” “怎么了阳堕?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵跋理,是天一觀的道長。 經(jīng)常有香客問我恬总,道長前普,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任壹堰,我火速辦了婚禮拭卿,結果婚禮上,老公的妹妹穿的比我還像新娘贱纠。我一直安慰自己峻厚,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布谆焊。 她就那樣靜靜地躺著惠桃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辖试。 梳的紋絲不亂的頭發(fā)上辜王,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音罐孝,去河邊找鬼呐馆。 笑死,一個胖子當著我的面吹牛莲兢,可吹牛的內(nèi)容都是我干的汹来。 我是一名探鬼主播辫继,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俗慈!你這毒婦竟也來了姑宽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤闺阱,失蹤者是張志新(化名)和其女友劉穎炮车,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酣溃,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘦穆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赊豌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扛或。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碘饼,靈堂內(nèi)的尸體忽然破棺而出熙兔,到底是詐尸還是另有隱情,我是刑警寧澤艾恼,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布住涉,位于F島的核電站,受9級特大地震影響钠绍,放射性物質(zhì)發(fā)生泄漏舆声。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一柳爽、第九天 我趴在偏房一處隱蔽的房頂上張望媳握。 院中可真熱鬧,春花似錦磷脯、人聲如沸蛾找。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腋粥。三九已至,卻和暖如春架曹,著一層夾襖步出監(jiān)牢的瞬間隘冲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工绑雄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留展辞,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓万牺,卻偏偏與公主長得像罗珍,于是被迫代替她去往敵國和親洽腺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容