zoukankan      html  css  js  c++  java
  • Android开发——使用高级的RecyclerView实现侧滑菜单删除功能(SwipeRecyclerView)

    使用之前,先简单介绍一下这个SwipeRecyclerView,这是严大(严振杰)基于RecyclerView的进行修改和封装的高级RecyclerView,其可以实现像QQ聊天界面的侧滑删除菜单,和一些高级的功能,我这里也就不一一列举出来了

    想要了解更多的同学,请看这一篇,作者写的http://blog.csdn.net/yanzhenjie1003/article/details/52115566

    swiperecyclerview的Github官网:https://github.com/yanzhenjie/SwipeRecyclerView

    前言:

    之前开发APP的时候,我就是想使用像QQ聊天那样,有侧滑菜单,可以实现删除啊,置顶啊这些功能,我应该不用截图了,大家使用QQ都是知道的,但是,之前学习的时候才是刚入门,那个时候只懂得listview,我也找到了swiperecyclerview这个高级recyclerview,但是,我连recyclerview都没有学习,做了一个测试都没成功,于是便是放弃了,之后,学习到了recyclerview,懂了之后,再一看swiperecyclerview,简直一下子恍然大悟,于是便是开始使用,虽然说恍然大悟了,但是在实际开发中也是遇到了不少问题,一一解决之后,我便是来这写下一篇博客

    使用步骤:

      1.添加依赖

        添加依赖 compile 'com.yanzhenjie:recyclerview-swipe:1.1.4

      2.使用控件

        

      3.创建适配器类

        这里直接参考我写的recyclerview的使用,http://www.cnblogs.com/kexing/p/8045007.html,严大写的这个直接兼容,超级方便

      4.相关设置

        由于我实现的是侧滑菜单删除功能,这里就只写这个,默认你已经有了数据,我这里使用的litepal数据库与其一起使用,关于litepal的使用请看这一篇http://www.cnblogs.com/kexing/p/8127146.html

        贴出代码

      LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            mRecyclerview.setLayoutManager(linearLayoutManager);//为swiperecyclerview设置布局管理器
    
    
           //设置侧滑菜单
            mRecyclerview.setSwipeMenuCreator(new SwipeMenuCreator() {
                @Override
                public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {
                    SwipeMenuItem deleteItem = new SwipeMenuItem(MainActivity.this)
                            .setBackground(R.drawable.check_button_bg)
                            .setImage(R.drawable.vector_drawable_delete)
                            .setHeight(ViewGroup.LayoutParams.MATCH_PARENT)//设置高,这里使用match_parent,就是与item的高相同
                            .setWidth(70);//设置宽
                    swipeRightMenu.addMenuItem(deleteItem);//设置右边的侧滑
                }
            });
            //设置侧滑菜单的点击事件
            mRecyclerview.setSwipeMenuItemClickListener(new SwipeMenuItemClickListener() {
                @Override
                public void onItemClick(SwipeMenuBridge menuBridge) {
                    menuBridge.closeMenu();
    
                    int direction = menuBridge.getDirection(); // 左侧还是右侧菜单。0是左,右是1,暂时没有用到
                    int adapterPosition = menuBridge.getAdapterPosition(); // RecyclerView的Item的position。
                    int menuPosition = menuBridge.getPosition(); // 菜单在RecyclerView的Item中的Position。
                    Toast.makeText(MainActivity.this, "删除"+adapterPosition, Toast.LENGTH_SHORT).show();
                }
            });
            mRecyclerview.setSwipeItemClickListener(new SwipeItemClickListener() {
                @Override
                public void onItemClick(View itemView, int position) {
                    Toast.makeText(MainActivity.this, "点击了"+position, Toast.LENGTH_SHORT).show();
                }
            });
            mRecyclerview.setAdapter(new RecyclerViewAdapter(books));//设置adapter

    我们慢慢分析,首先呢,就是与普通的recyclerview一样,设置线性的布局,这里我就不多说了

    之后需要设置一个菜单管理器,setSwipeMenuCreator()这个方法,里面的参数是一个SwipeMenuCreator,没有的话我们就new一个,类似onClicklistener那样,直接在括号里面new就是匿名内部类使用,之后,我们就可以直接在里面使用代码生成我们的侧滑菜单,来看一下图片

    当然,如果你不想用图标,使用setText方法就是单独的文字,具体大家可以自己尝试

     接下来,我们需要设置删除的点击事件,直接调用setSwipeMenuItemClickListener,参数里也是new一个新的SwipeMenuItemClickListener类

    这里,我们需要注意,先调用menuBridge的closeMenu(),这样可以防止监听状态的错误发生

    可以看到,我在里面写了三个整型数据,这三个数据都是通过menuBridge的相关方法获取的,那这三个数据有什么用呢?

    int direction = menuBridge.getDirection();

    左侧还是右侧菜单。0是左,右是1,今天的使用暂时没有用到

    int adapterPosition = menuBridge.getAdapterPosition();

    RecyclerView的Item的position,删除功能的时候,就是需要你将该item删除,这个时候就会用到这个数据,从而判断出用户点击了删除后对应的那一个item
    int menuPosition = menuBridge.getPosition();

    菜单在RecyclerView的Item中的Position,当侧滑菜单中不止一个item,还有其他的什么置顶啊,这个时候就需要这个数据

    你就可以判断用户点击的是哪一个菜单,从而实现相应的功能,从你滑出的那个侧滑菜单从左到右算起,最左边为0

     最后,setSwipeItemClickListener,就是设置item的点击监听器,如果看过我之前写的那一篇recyclerview的使用,应该知道,我是在adapter里面实现的item的点击事件

    这里,swiperecyclerview就直接设置了,就不用到adapter里面中去设置了

    好了,到这里就行了吗?其实还不行,我在测试的时候就发现了,删除了一个item,swiperecyclerview并没有实时更新,经过一番摸索终于死找到了解决问题的办法

    我们需要在我们定现删除的方法中添加下面代码

           temp = equipmentResults.get(position);//由position找到list集合中的对象
         DataSupport.deleteAll(EquipmentResult.class,"name = ? and type = ?",temp.getName(),temp.getType());//执行删除,litepal数据库的删除方法 equipmentResults.remove(temp);//从list中移出需要删除的那个对象 mMrecyclerview.setAdapter(new mRecyclerViewAdatper(equipmentResults));//重新设置adapter

     我的代码供大家参考,有个思路就行了

    PS:删除建议加个对话框,以免用户不小心操作

  • 相关阅读:
    suseoj 1211: 子集和问题 (dfs)
    suseoj 1210: 会场安排问题 (贪心)
    suseoj 1209: 独立任务最优调度问题(动态规划)
    四级词汇(二)
    四级单词(一)
    nyoj 84-阶乘的0 (规律题)
    nyoj 83-迷宫寻宝(二) (计算几何, 叉积)
    nyoj 82-迷宫寻宝(一) (多重BFS)
    nyoj 79-拦截导弹 (动态规划)
    nyoj 78-圈水池 (凸包)
  • 原文地址:https://www.cnblogs.com/stars-one/p/8268835.html
Copyright © 2011-2022 走看看