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