前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,原本很简单一个使用,阅读量还挺高的,原博客传送门。java
今天介绍一个RecyclerView Item侧滑菜单,RecyclerView滑动删除Item,RecyclerView长按拖拽Item的开源项目,效果看下图,你们也能够下载演示apk具体操做体验下SwipeRecyclerView的强大。android
须要说明的是,本库没有对RecyclerView作大的修改,只是ItemView的封装。看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已。git
今天的博客将完美解决这些问题:github
RecyclerView侧滑菜单(左右两侧均可以添加)(List、Grid两种形式)。微信
RecyclerView长按拖拽Item(List、Grid两种形式)。app
RecyclerView侧滑删除item(List、Grid两种形式)。框架
指定RecyclerView的某一个Item不能滑动删除或长按拖拽(List、Grid两种形式)。ide
根据Item的ViewType来决定显示的菜单。布局
用SwipeMenuLayout在任何地方均可以实现你本身的侧滑菜单。spa
为何没有下拉刷新?看这里的下拉刷新框架介绍。
SwipeRecyclerView的源码托管在Github:https://github.com/yanzhenjie...,欢迎Star。
若是不能打开Github,直接从CSDN上下载Demo。
若是网页加载速度慢,能够下载demo的apk看效果。
RecyclerView Item侧滑菜单。左右两侧均可以添加侧滑菜单,菜单Item包括图标、文字、点击背景颜色等。也能够根据Item的ViewType来决定某个Item的Menu的样子、类型等:
RecyclerView Item长按后拖拽Item移动位置。同时支持Item
长按拖拽、Item侧滑显示菜单。包括各类布局管理器,好比LinearLayoutManager
、GridLayoutManager
都完美支持:
能够指定某个Item不能被拖拽,指定某个Item不能被滑动删除:
Eclipse 请自行下载源码。
AndroidStudio使用Gradle构建添加依赖(推荐)
compile 'com.yanzhenjie:recyclerview-swipe:1.0.0'
本库引用的RecyclerView版本以下:
compile 'com.android.support:recyclerview-v7:23.4.0'
这里列出关键实现,具体请参考demo,或者加我博客左侧的交流群或者关注个人公众微信一块儿来讨论。
侧滑菜单使用自定义Layout实现,继承自FragmeLayout。
长按拖拽Item、滑动Item删除由ItemTouchHelper实现。
recyclerView.setLongPressDragEnabled(true);// 开启长按拖拽 recyclerView.setItemViewSwipeEnabled(true);// 开启滑动删除。 recyclerView.setOnItemMoveListener(onItemMoveListener);// 监听拖拽和侧滑删除,更新UI。 ... /** * 当Item移动的时候监听。 */ private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() { @Override public boolean onItemMove(int fromPosition, int toPosition) { // 当Item被拖拽的时候,交换Item的位置。 Collections.swap(mStrings, fromPosition, toPosition); mMenuAdapter.notifyItemMoved(fromPosition, toPosition); return true; } @Override public void onItemDismiss(int position) { // 当Item被滑动删除的时候,删除Item。 mStrings.remove(position); mMenuAdapter.notifyItemRemoved(position); Toast.show(mContext, "第" + position + "条被删除。"); } };
侧滑菜单支持自动打开某个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);// 添加一个按钮到右侧侧菜单。 } };
第四步,继承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下载传送门。
版权声明:本文转自严振杰的专栏
欢迎加入个人技术交流群:Android 愚公移山③ 547839514
欢迎关注个人公众号,长期不断推送优选博文、优秀开源项目,欢迎投稿: