(有圖)仿QQ側滑菜單:RecyclerView側滑菜單,長按拖拽,滑動刪除

RecyclerView的出現不能否認是開發者們的福利,它自帶的ItemTouchHelper能很是輕鬆的完成側滑刪除、長按拖拽,可是不免有的開發者不會使。再加上實際的開發中側滑刪除每每會用側滑菜單來實現,這就難爲了有些開發者了。SwipeRecyclerView的出現就完美的解決了這些問題,側滑刪除、長按拖拽Item僅須要一句話…java

  1. 須要說明的是,本庫沒有對RecyclerView作大的修改,只是ItemView的封裝。看起來是對RecyclerView的修改,其實僅僅是爲RecyclerView添加了使用的方法API而已。
  2. 應開發者們的要求,本庫已經更新了三個版本了,會一直維護下去,根據小夥伴的要求,之後也會添加一些其它功能。

由於SwipeRecyclerView發佈已經一個月了,如今有了幾個不小的更新,都是剛需,因此再次分享出來給你們,但願你們能多多支持。android

SwipeRecyclerView將完美解決這些問題:git

  1. 如下功能所有支持:豎向ListView、橫向ListView、Grid、StaggeredGrid四種形式。
  2. RecyclerView 左右兩側 側滑菜單。
  3. 菜單能夠自適應Item不一樣高度。
  4. 某一個Item顯示的不一樣的菜單(相似QQ)。
  5. 菜單橫向排布、菜單豎向排布(看下圖)。
  6. RecyclerView長按拖拽Item。
  7. RecyclerView側滑刪除item。
  8. 指定RecyclerView的某一個Item不能滑動刪除或長按拖拽。
  9. 用SwipeMenuLayout在任何地方均可以實現你本身的側滑菜單。
  10. 使用SwipeRecyclerView下拉刷新、自動加載更多。
  11. 能夠和ViewPager嵌套使用(兼容滑動衝突)。

SwipeRecyclerView的源碼託管在Github:github.com/yanzhenjie/…,歡迎Star。github

若是你是手機看本文,記不住項目地址沒關係,記住個人我的主頁就好,個人全部項目在我網站都有。app

個人域名是:yanzhenjie.com,也就是我名字嚴振杰.com,我相信你確定記住了,沒記住的再看一眼啦。框架

要是還沒記住,更簡單的是百度/Google搜索我名字:嚴振杰,排名第一的就是我。ide

效果圖

gif有一些失真,且網頁加載速度慢,能夠[下載demo的apk][3]看效果。 佈局

側滑菜單

  1. 左右兩側都有菜單,主動調出第幾個菜單或者手指滑動出現。
  2. 根據ViewType某一個Item顯示的不一樣的菜單(相似QQ)

<兩側側滑菜單 不一樣的Item不一樣的菜單

和ViewPager嵌套 下拉刷新、自動加載更多

  1. 和ViewPager嵌套使用,兼容了滑動衝突。
  2. 能夠和任何下拉刷新的框架結合,滑動到底部自動加載更多。

和ViewPager嵌套使用 下拉刷新加載更多

長按拖拽 側滑菜單結合使用

  1. 一直按住Item進行拖拽排序,支持List、Grid形式。
  2. 長按拖拽而且和側滑菜單結合使用。

List拖拽排序、菜單 Grid拖拽排序、菜單

直接滑動刪除 長按拖拽Item排序

  1. 側滑直接刪除,也能夠長按拖拽排序。
  2. 能夠指定某個Item不能被側滑刪除、不能被長按拖拽。

側滑刪除 指定某一個不能拖拽、滑動刪除

豎型菜單 用自定義佈局實現本身的菜單

  1. 給菜單設置排列方向,支持橫向、豎向。
  2. 開發者用庫中的SwipeMenuLayout開發本身的側滑菜單。

菜單排列方向 自定義菜單

引用方法

  • Eclipse 請自行下載源碼
  • AndroidStudio使用Gradle構建添加依賴(推薦)
    compile 'com.yanzhenjie:recyclerview-swipe:1.0.2'複製代碼

Or Maven:網站

<dependency>
  <groupId>com.yanzhenjie</groupId>
  <artifactId>recyclerview-swipe</artifactId>
  <version>1.0.2</version>
  <type>pom</type>
</dependency>複製代碼

使用介紹

這裏列出關鍵實現,具體請參考demo,或者加最上面的交流羣一塊兒討論。 更多教程請進入個人博客查看。spa

啓用SwipeReyclerView的長按Item拖拽功能和側滑刪除功能

recyclerView.setLongPressDragEnabled(true);// 開啓長按拖拽
recyclerView.setItemViewSwipeEnabled(true);// 開啓滑動刪除。
recyclerView.setOnItemMoveListener(onItemMoveListener);// 監聽拖拽和側滑刪除,更新UI和數據。複製代碼

添加Item側滑菜單

側滑菜單支持自動打開某個Item的菜單,並能夠指定是左邊仍是右邊的:

// 打開第一個Item的左側菜單。
recyclerView.openLeftMenu(0);

// 打開第一個Item的右側菜單。
recyclerView.openRightMenu(0);複製代碼
  • 第一步,引用自定義View:SwipeMenuReyclerView:

    <com.yanzhenjie.recyclerview.swipe.SwipeMenuRecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" />複製代碼
  • 第二步,設置菜單建立器、菜單點擊監聽:

    SwipeMenuRecyclerView swipeMenuRecyclerView = findViewById(R.id.recycler_view);
    // 設置菜單建立器。
    swipeMenuRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
    // 設置菜單Item點擊監聽。
    swipeMenuRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);複製代碼
  • 第三步,菜單建立器建立菜單:

    /** * 菜單建立器。在Item要建立菜單的時候調用。 */
    private SwipeMenuCreator swipeMenuCreator = new SwipeMenuCreator() {
      @Override
      public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {
    
          SwipeMenuItem addItem = new SwipeMenuItem(mContext)
              .setBackgroundDrawable(R.drawable.selector_green)// 點擊的背景。
              .setImage(R.mipmap.ic_action_add) // 圖標。
              .setWidth(size) // 寬度。
              .setHeight(size); // 高度。
          swipeLeftMenu.addMenuItem(addItem); // 添加一個按鈕到左側菜單。
    
          SwipeMenuItem deleteItem = new SwipeMenuItem(mContext)
              .setBackgroundDrawable(R.drawable.selector_red)
              .setImage(R.mipmap.ic_action_delete) // 圖標。
              .setText("刪除") // 文字。
              .setTextColor(Color.WHITE) // 文字顏色。
              .setTextSize(16) // 文字大小。
              .setWidth(size)
              .setHeight(size);
          swipeRightMenu.addMenuItem(deleteItem);// 添加一個按鈕到右側側菜單。.
    
          // 上面的菜單哪邊不要菜單就不要添加。
      }
    };複製代碼

更多使用方法請參考Demo,或者加最上方的QQ羣來交流。

  • 第四步,繼承SwipeMenuAdapter,和正常的Adapter同樣使用:

    public class MenuAdapter extends SwipeMenuAdapter<MenuAdapter.DefaultViewHolder> {
    
      @Override
      public int getItemCount() {
          return 0;
      }
    
      @Override
      public View onCreateContentView(ViewGroup parent, int viewType) {
          return null;
      }
    
      @Override
      public ViewHolder onCompatCreateViewHolder(View realContentView, int viewType) {
          return null;
      }
    
      @Override
      public void onBindViewHolder(MenuAdapter.DefaultViewHolder holder, int position) {
      }
    }複製代碼

就到這裏,更多的細節,請參考Github上的demo和源碼,源碼demo下載傳送門

相關文章
相關標籤/搜索