1. 程式人生 > >Android側滑-RecyclerView輕鬆實現高效的側滑選單

Android側滑-RecyclerView輕鬆實現高效的側滑選單

一 前言

利用系統類ItemTouchHelper實現簡單高效的RecyclerView側滑選單!

仿qq的側滑,跟隨滑動…

簡單的側滑點選刪除,覆蓋滑動…

二 知識準備

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

  • ItemTouchHelper.Callback

    官方的解釋是這樣的,這個類是ItemTouchHelper和您的應用程式之間的契約。它允許您控制每個ViewHolder都啟用了哪些觸控行為,並且在user執行這些操作時也會接收回調 .通俗來說就是我們可以再這個類裡面去控制我們想要的觸控效果,也就是側滑還是拖拽.然後可以得到動作執行中的回撥,和動作執行結束後的回撥.

我們需要繼承ItemTouchHelper.Callback來實現自己的邏輯.我先大致的介紹一下具體的使用方法,詳情還請自行查資料.請看程式碼:

/**
 * 實現自己的邏輯
 * 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的一些弊端和好處:

弊端:
1 當處於滑動狀態的時候不下發點選事件.
2 滑動的距離為RecyclerView的寬度,往往就是螢幕的寬度.
3 限制滑動距離之後,無法正常恢復側滑(讓滑動的View復位).
4 當Item手動滑動之後不能自由的自動的恢復側滑(讓滑動的View復位).
5 無法做到特定的Item不讓側滑.
6 總問言之側滑不流暢.

好處:
1 側滑佈局的樣式我們可以隨意的更改.
2 滑動的距離可以隨意的固定.
3 側滑恢復的動畫我們可以控制.
4 總而言之給了開發者很大的自由.

三 改進版的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歡迎start

結束

這裡只是大概的介紹了一下定製版WItemTouchHelperPlus和系統類的一些不同,以及定製版的一些用法,希望大家多多指導文章中出現的錯誤,歡迎大家的反饋,歡迎評論吐槽哦~

如果大家需要WItemTouchHelperPlus或者系統類ItemTouchHelper的原始碼解釋的話請評論區留言哦~ 謝謝各位看官!
歡迎大家關注
我的掘金
我的CSDN
我的簡書
Github

APK下載

相關推薦

Android-RecyclerView輕鬆實現高效選單

一 前言 利用系統類ItemTouchHelper實現簡單高效的RecyclerView側滑選單! 仿qq的側滑,跟隨滑動… 簡單的側滑點選刪除,覆蓋滑動… 二 知識準備 ItemTouchHelper是Android系統提供的一個幫助

安卓常用控制元件RecyclerView+HorizontalScrollView實現item效果 安卓常用控制元件RecyclerView+HorizontalScrollView實現item效果

原 安卓常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果 2017年10月28日 12:23:14 低-調

Android SwipeRefreshLayout和RecyclerView 使用實現重新整理資料

之前寫重新整理資料的時候都會使用自定義的控制元件實現,現在Google給我們提供了更加方便的,剛寫完,感覺還挺好看的,希望讀到這篇文章的你能夠喜歡。 SwipeRefreshLayout 簡介 SwipeRefreshLayout元件只接受一個子元件:即需

Android 中使用 RecyclerView + SnapHelper 實現類似 ViewPager 效果

寫在前面:強大的Recyclerview,官方提供的幫助類. 1 前言 在 一些特定的場景下,如照片的瀏覽,卡片列表滑動瀏覽,我們希望當滑動停止時可以將當前的照片或者卡片停留在螢幕中央,以吸引使用者的焦點。在 Android 中,我們可以使用RecyclerView

RecyclerView輕鬆實現懸浮頭部分組列表

關於RecyclerView的使用,相信大家都不陌生,並且功能的強大早已讓眾多開發者臣服,本篇主要講解聯絡人列表效果的懸浮頭部分組列表的實現,先上效果圖: 一般的思路應該是利用RecyclerView的itemType來區分標題和下面的子資料而採用不同

Android筆記(一):ViewDragHelper實現底部上同時底部下滑

先看看效果圖: 自定義佈局控制元件: public class DragLayout extends FrameLayout { private int title; //限制上滑後的頂部標題高度大小 private Status mStatus

Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 實現頂部圖片下拉視差效果

既然這位兄弟已經實現了該功能,我為什麼還要另寫一篇文章呢? 第一是,因為我笨啊,這兄弟的程式碼功底很強,我模仿不出他實現的效果(我不是懶,真的)。 第二也是,我專案中沒用到NestedScrol

Android學習之CoordinatorLayout輕鬆實現360軟體詳情頁

今天在專案中,遇見實現類似360軟體詳情頁的效果,結合現在比較流行的Material design,採用了CoordinatorLayout來實現這個效果,跟大家分享一下。 首先,看一下需求的效果,由於不會搞gif圖,所以圖是從翔哥那摳出來的,效果是一樣的。

Android 雙擊退出程序實現(有界面)

是的 tro raw idt style tap sys .com ges 大家好,今天帶來雙擊退出程序實現方法,我知道,網上也是有許多關於雙擊退出程序實現的方法,所以,聽見當然是給大家帶來不一樣的雙擊退出的實現方法。 首先帶來的便是關於onKeyDown和onKe

Android使用ToolBar+DrawerLayout+NavigationView實現抽屜效果

ets 代碼 ret r+ content custom port 單選 常見 學會使用DrawerLayout 學會使用NavigationView 學會使用ToolBar+DrawerLayout+NavigationView實現側滑抽屜效果 學會實現Toolbar

android手把手教你實現QQ選單效果

側滑選單功能非常常見,借鑑學習了之後,自己總結記錄一下,下面實現一種最簡單的側滑選單,後面再修改程式碼實現不同的側滑選單效果 首先是第一種效果 第一種效果是繼承ViewGroup,需要我們自己來測量、滑動處理等。 一、首先講解一下思路: 1、繼承GroupView重

Android自定義View之仿QQ選單實現

最近,由於正在做的一個應用中要用到側滑選單,所以通過查資料看視訊,學習了一下自定義View,實現一個類似於QQ的側滑選單,順便還將其封裝為自定義元件,可以實現類似QQ的側滑選單和抽屜式側滑選單兩種選單。 下面先放上效果圖: 我們這裡的側

android 開發 -- NavigationView和DrawerLayout實現 欄(Material Design)

隨著 Google I/O 2015,新的 Android Design Support Library給開發者帶來了一些重要的 Material Design 元件,並且向下相容到 Android 2.1, NavigationView 就是其中之一,可用於方便地建立導航抽

Android滑動選單特效實現選單實現

人人客戶端有一個特效還是挺吸引人的,在主介面手指向右滑動,就可以將選單展示出來,而主介面會被隱藏大部分,但是仍有左側的一小部分同選單一起展示。 據說人人客戶端的這個特效是從facebook客戶端模仿來的,至於facebook是不是又從其它地方模仿來的就不得而知了。好,今天我們就一起來實現這個效果,總之我

[android]手把手通過一個類實現退出activity功能

1、概述 *本文程式碼 非原創 來自於 一個 叫做NBAPlus的開原始碼中.https://github.com/SilenceDut/NBAPlus 有興趣的小夥伴們可以好好去了解下,推薦下,真™可以的~ 2、簡單描述下,所謂側滑退出功

Android中使用NavigationView實現抽屜效果中Menu選單欄設定

a、在value/styles.xml中定義樣式<!--設定Menu中item的字型大小-->     <style name="WindowTitle" parent="@android:style/TextAppearance">         <item name="a

android欄的實現

1:drawerlayout類作為父控制元件 出現在最頂層。2:被包裹的二級佈局就可以是 側滑欄或者是頁面本身。3:只要是在耳機佈局的gravaty——layout屬性宣告一個start屬性,即可實現策側滑效果。下面貼程式碼:<android.support.v4.wi

詳解RecyclerView+BGARefreshLayout實現自定義下拉重新整理、上拉載入和刪除效果

前言 還有2個月就過年了,對於我們這樣在外漂泊的異鄉人來說,一家人團聚在一起,吃一頓團圓飯,那是再幸福不過的事了。我們之所以遠離家鄉來到異鄉就像異鄉人這首歌寫的一樣,只為一扇窗! 正文 上篇文章給大家講解了一下關於RecyclerView的使用,今天給

Android基礎篇:Android Studio欄的實現

1 . 先建立一個.xml檔案,命名為left_menu代表我們的側滑欄,(這個名字可以自己定義,不要在意。)把全部刪除改成 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:a

集下拉重新整理、自動載入和選單RecyclerView基本實現原理

目錄 目錄 前言 結尾 前言   現在這個功能的框架也挺多的了。之所以要寫是因為這個框架是自己親手實現的。說起來有點小激動,這是我正經寫出來的第一個框架。對於”不要重複造輪子”這句話,我一直不是太認同,得從不同的維度看。如果從使用上