打造最强RecyclerView,Item侧滑菜单,长按拖拽Item,滑动删除Item

来源:互联网 发布:涉密软件开发资质 编辑:程序博客网 时间:2024/05/22 01:28

版权声明:本文转自严振杰的博客。

前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,本来很简单一个使用,阅读量还挺高的,原博客传送门。

今天介绍一个RecyclerView Item侧滑菜单,RecyclerView滑动删除Item,RecyclerView长按拖拽Item的开源项目,效果看下图,大家也可以下载演示apk具体操作体验下SwipeRecyclerView的强大。

需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装。看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已。

今天的博客将完美解决这些问题: 
1. 指定某个Item不能滑动删除或者不能长按拖拽。 
2. RecyclerView Item添加侧滑菜单。 
3. 自动打开指定的某个Item菜单。 
4. 解决RecyclerView和Item的滑动冲突。 
5. 解决RecyclerView的Item滑动和下拉刷新框架的冲突。

SwipeRecyclerView的源码托管在Github:https://github.com/yanzhenjie/SwipeRecyclerView,欢迎Star。

如果不能打开Github,直接从CSDN上下载Demo。


演示Demo apk下载

效果图

如果网页加载速度慢,可以下载demo的apk看效果。

侧滑菜单

RecyclerView Item侧滑菜单。左右两侧都可以添加侧滑菜单,菜单Item包括图标、文字、点击背景颜色等。也可以根据Item的ViewType来决定某个Item的Menu的样子、类型等:

双向侧滑 根据ViewType显示菜单

拖拽、侧滑菜单

RecyclerView Item长按后拖拽Item移动位置。同时支持Item长按拖拽、Item侧滑显示菜单。包括各种布局管理器,比如LinearLayoutManager、GridLayoutManager都完美支持:

Item拖拽和菜单结合 Item拖拽和菜单结合

拖拽、侧滑删除

可以指定某个Item不能被拖拽,指定某个Item不能被滑动删除:

拖拽与滑动删除 拖拽与滑动删除

引用方法

  • Eclipse 请自行下载源码。

  • AndroidStudio使用Gradle构建添加依赖(推荐)

  1. compile 'com.yanzhenjie:recyclerview-swipe:1.0.0'1

本库引用的RecyclerView版本如下:

  1. compile 'com.android.support:recyclerview-v7:23.4.0'1

使用介绍

这里列出关键实现,具体请参考demo,或者加我博客左侧的交流群或者关注我的公众微信一起来讨论。

实现原理

  1. 侧滑菜单使用自定义Layout实现,继承自FragmeLayout。

  2. 长按拖拽Item、滑动Item删除由ItemTouchHelper实现。

启用SwipeReyclerView的长按Item拖拽功能和侧滑删除功能

  1. recyclerView.setLongPressDragEnabled(true);// 开启长按拖拽
  2. recyclerView.setItemViewSwipeEnabled(true);// 开启滑动删除。
  3. recyclerView.setOnItemMoveListener(onItemMoveListener);// 监听拖拽和侧滑删除,更新UI。
  4.  
  5. ...
  6.  
  7.  /**
  8.  * 当Item移动的时候监听。
  9.  */
  10. private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() {
  11.     @Override
  12.     public boolean onItemMove(int fromPosition, int toPosition) {
  13.         // 当Item被拖拽的时候,交换Item的位置。
  14.         Collections.swap(mStrings, fromPosition, toPosition);
  15.         mMenuAdapter.notifyItemMoved(fromPosition, toPosition);
  16.         return true;
  17.     }
  18.  
  19.     @Override
  20.     public void onItemDismiss(int position) {
  21.         // 当Item被滑动删除的时候,删除Item。
  22.         mStrings.remove(position);
  23.         mMenuAdapter.notifyItemRemoved(position);
  24.         Toast.show(mContext, "第" + position + "条被删除。");
  25.     }
  26. };

添加Item侧滑菜单

侧滑菜单支持自动打开某个Item的菜单,并可以指定是左边还是右边的:

  1. // 打开第一个Item的左侧菜单。
  2. recyclerView.openLeftMenu(0);
  3.  
  4. // 打开第一个Item的右侧菜单。
  5. recyclerView.openRightMenu(0);
  • 第一步,引用自定义View:SwipeMenuReyclerView:

  1. <com.yanzhenjie.recyclerview.swipe.SwipeMenuRecyclerView
  2.     android:id="@+id/recycler_view"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="wrap_content"
  5.     app:layout_behavior="@string/appbar_scrolling_view_behavior" />
  • 第二步,设置菜单创建器、菜单点击监听:

  1. SwipeMenuRecyclerView swipeMenuRecyclerView = findViewById(R.id.recycler_view);
  2. // 设置菜单创建器。
  3. swipeMenuRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
  4. // 设置菜单Item点击监听。
  5. swipeMenuRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);
  • 第三步,菜单创建器创建菜单:

  1. /**
  2.  * 菜单创建器。在Item要创建菜单的时候调用。
  3.  */
  4. private SwipeMenuCreator swipeMenuCreator = new SwipeMenuCreator() {
  5.     @Override
  6.     public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {
  7.  
  8.         SwipeMenuItem addItem = new SwipeMenuItem(mContext)
  9.             .setBackgroundDrawable(R.drawable.selector_green)// 点击的背景。
  10.             .setImage(R.mipmap.ic_action_add) // 图标。
  11.             .setWidth(size) // 宽度。
  12.             .setHeight(size); // 高度。
  13.         swipeLeftMenu.addMenuItem(addItem); // 添加一个按钮到左侧菜单。
  14.  
  15.         SwipeMenuItem deleteItem = new SwipeMenuItem(mContext)
  16.             .setBackgroundDrawable(R.drawable.selector_red)
  17.             .setImage(R.mipmap.ic_action_delete) // 图标。
  18.             .setText("删除") // 文字。
  19.             .setTextColor(Color.WHITE) // 文字颜色。
  20.             .setTextSize(16) // 文字大小。
  21.             .setWidth(size)
  22.             .setHeight(size);
  23.         swipeRightMenu.addMenuItem(deleteItem);// 添加一个按钮到右侧侧菜单。
  24.     }
  25. };
  • 第四步,继承SwipeMenuAdapter,和正常的Adapter一样使用:

  1. public class MenuAdapter extends SwipeMenuAdapter<MenuAdapter.DefaultViewHolder> {
  2.  
  3.     @Override
  4.     public int getItemCount() {
  5.         return 0;
  6.     }
  7.  
  8.     @Override
  9.     public View onCreateContentView(ViewGroup parent, int viewType) {
  10.         return null;
  11.     }
  12.  
  13.     @Override
  14.     public ViewHolder onCompatCreateViewHolder(View realContentView, int viewType) {
  15.         return null;
  16.     }
  17.  
  18.     @Override
  19.     public void onBindViewHolder(MenuAdapter.DefaultViewHolder holder, int position) {
  20.     }
  21. }

就到这里,更多的细节,请参考Github上的demo和源码,源码demo下载传送门。

阅读全文
0 0
原创粉丝点击