最新公告
  • 欢迎您光临AA分享网,这里是高级程序员技术学习、分享的分享平台立即加入我们
  • 打造最强RecyclerView,Item侧滑菜单,长按拖拽Item,滑动删除Item

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

    前几天写了一片关于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构建添加依赖(推荐)

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

    本库引用的RecyclerView版本如下:

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

    使用介绍

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

    实现原理

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

    2. 长按拖拽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:

    <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下载传送门。

    AA分享网一个高级程序员的学习、分享的IT资源分享平台
    AA分享网-企业网站源码-PHP源码-网站模板-视频教程-IT技术教程 » 打造最强RecyclerView,Item侧滑菜单,长按拖拽Item,滑动删除Item

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    站壳网
    一个高级程序员模板开发平台

    发表评论

    • 74会员总数(位)
    • 2802资源总数(个)
    • 57本周发布(个)
    • 10 今日发布(个)
    • 237稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情