登录 立即注册
安币:

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

[复制链接]
来自: yanzhenjie 分类: Android精品源码 上传时间: 2016-8-11 14:02:22
Tag:
立即下载
收藏

项目介绍:

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

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

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

今天的博客将完美解决这些问题:
1. RecyclerView侧滑菜单(左右两侧都可以添加)(List、Grid两种形式)。
2. RecyclerView长按拖拽Item(List、Grid两种形式)。
3. RecyclerView侧滑删除item(List、Grid两种形式)。
4. 指定RecyclerView的某一个Item不能滑动删除或长按拖拽(List、Grid两种形式)。
5. 根据Item的ViewType来决定显示的菜单。
6. 用SwipeMenuLayout在任何地方都可以实现你自己的侧滑菜单。
7. 为什么没有下拉刷新?看这里的下拉刷新框架介绍。

SwipeRecyclerView的源码托管在Github:https://github.com/yanzhenjie/SwipeRecyclerView,欢迎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拖拽功能和侧滑删除功能
[Java] 查看源文件 复制代码
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的菜单,并可以指定是左边还是右边的:

[Java] 查看源文件 复制代码
// 打开第一个Item的左侧菜单。
recyclerView.openLeftMenu(0);

// 打开第一个Item的右侧菜单。
recyclerView.openRightMenu(0);


[color=rgb(51, 102, 153) !important]复制代码

  • 第一步,引用自定义View:SwipeMenuReyclerView:
[XML] 查看源文件 复制代码


  • 第二步,设置菜单创建器、菜单点击监听:
[Java] 查看源文件 复制代码
SwipeMenuRecyclerView swipeMenuRecyclerView = findViewById(R.id.recycler_view);
// 设置菜单创建器。
swipeMenuRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
// 设置菜单Item点击监听。
swipeMenuRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);



  • 第三步,菜单创建器创建菜单:
[Java] 查看源文件 复制代码
/**
 * 菜单创建器。在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一样使用:
[Java] 查看源文件 复制代码
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下载传送门:https://github.com/yanzhenjie/SwipeRecyclerView

相关源码推荐:

    我来说两句
    所有评论(33)
    subsoil 2016-8-12 13:58:57
    mark,收藏了
    回复
    suzhouliuyan 2016-8-12 13:59:37
    相当不错,感谢无私分享精神!
    回复
    yanghaiju2012 2016-8-12 14:04:48
    感谢大神~
    回复
    东西南北 2016-8-12 14:09:08
    感谢分享,楼主V5~
    回复
    zhangjhcx 2016-8-12 14:10:47
    kanakan
    回复
    设女郎 2016-8-12 14:13:50
    学习...学习...
    回复
    Maoshine 2016-8-12 14:23:01
    楼主威武啊,安卓巴士有你更给力!
    回复
    12345下一页
    上传代码
    查看数:3225 收藏数:22 下载数: 点赞数:1
    相关代码
      代码贡献英雄榜
      用户名 下载数
      联系我们
      首页/微信公众账号投稿

      帖子代码编辑/版权问题

      QQ:435399051,769657487

      如何获得代码达人称号

      如何成为签约作者

      代码分类

      联系我们
      关闭
      合作电话:
      15618560077
      Email:
      805941275@qq.com
      商务市场合作/投稿
      问题反馈及帮助
      联系我们

      广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

      快速回复 返回顶部 返回列表