版权声明:转载必须注明本文转自严振杰的博客: blog.csdn.net/yanzhenjie1…
前几天写了一片关于RecyclerView滑动删除Item,RecyclerView长按拖拽Item的博客,本来很简单一个使用,阅读量还挺高的,原博客传送门。
今天介绍一个RecyclerView Item侧滑菜单,RecyclerView滑动删除Item,RecyclerView长按拖拽Item的开源项目,效果看下图,大家也可以下载演示apk具体操作体验下SwipeRecyclerView的强大。
今天的博客将完美解决这些问题:
1. 指定某个Item不能滑动删除或者不能长按拖拽。
2. RecyclerView Item添加侧滑菜单。
3. 自动打开指定的某个Item菜单。
4. 解决RecyclerView和Item的滑动冲突。
5. 解决RecyclerView的Item滑动和下拉刷新框架的冲突。
SwipeRecyclerView的源码托管在Github:github.com/yanzhenjie/…,欢迎Star。
效果图
如果网页加载速度慢,可以下载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实现。
启用SwipeReyclerView的长按Item拖拽功能和侧滑删除功能
recyclerView.setLongPressDragEnabled(true);
recyclerView.setItemViewSwipeEnabled(true);
recyclerView.setOnItemMoveListener(onItemMoveListener);
...
/**
* 当Item移动的时候监听。
*/
private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() {
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
Collections.swap(mStrings, fromPosition, toPosition);
mMenuAdapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
@Override
public void onItemDismiss(int position) {
mStrings.remove(position);
mMenuAdapter.notifyItemRemoved(position);
Toast.show(mContext, "第" + position + "条被删除。");
}
};
添加Item侧滑菜单
侧滑菜单支持自动打开某个Item的菜单,并可以指定是左边还是右边的:
recyclerView.openLeftMenu(0);
recyclerView.openRightMenu(0);
- 第一步,引用自定义View:SwipeMenuReyclerView:
SwipeMenuRecyclerView swipeMenuRecyclerView = findViewById(R.id.recycler_view);
swipeMenuRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
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 {
@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下载传送门。
版权声明:转载必须注明本文转自严振杰的博客: blog.csdn.net/yanzhenjie1…
欢迎加入我的技术交流群:Android 愚公移山③ 547839514
欢迎关注我的公众号,长期不断推送优选博文、优秀开源项目,欢迎投稿: