(有图)仿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下载传送门

相关文章
相关标签/搜索