android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item

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

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

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

今天的博客将完美解决这些问题:

RecyclerView侧滑菜单(左右两侧都可以添加)(List、Grid两种形式)。

RecyclerView长按拖拽Item(List、Grid两种形式)。

RecyclerView侧滑删除item(List、Grid两种形式)。

指定RecyclerView的某一个Item不能滑动删除或长按拖拽(List、Grid两种形式)。

根据Item的ViewType来决定显示的菜单。

用SwipeMenuLayout在任何地方都可以实现你自己的侧滑菜单。

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

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

效果图

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

侧滑菜单

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

14600000067603231460000006237221

拖拽、侧滑菜单

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

14600000062372271460000006237229

拖拽、侧滑删除

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

14600000062372321460000006237235

引用方法

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);// 监听拖拽和侧滑删除,更新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的菜单,并可以指定是左边还是右边的:

// 打开第一个Item的左侧菜单。

recyclerView.openLeftMenu(0);

// 打开第一个Item的右侧菜单。

recyclerView.openRightMenu(0);

第一步,引用自定义View:SwipeMenuReyclerView:

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 {

@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

欢迎关注我的公众号,长期不断推送优选博文、优秀开源项目,欢迎投稿:

1460000006237240

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值