进击的RecyclerView——LRecyclerView

进击的RecyclerView——LRecyclerView


本篇来自 一叶飘舟 (也是一位****大神)再次投稿,在他原作的基础上进行了大幅度升级,之前就很受大家欢迎,希望依旧给你们带来惊喜。


读完本文大概需要8分钟~~~eh~~~或许还要再久点。。。


一叶飘舟 的博客地址:

http://blog.****.net/jdsjlzx


LRecyclerView能做什么


如果你之前没有听说过 LRecyclerView,那么请点击作者之前推文(之前取名 SuperRecyclerView,但是github有重名项目,故现改为 LRecyclerView): 

SuperRecyclerView,只为打造出更好用的RecyclerView》


经过再三思考,同时也为了大家使用方便,LRecyclerView 集成了 SwipeMenu 系列功能,包括 Item侧滑菜单、长按拖拽Item,滑动删除Item 等功能。


demo apk下载地址:

https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/app/app-release.apk


功能演示


本次新增 SwipeMenu 系列功能描述如下:


  1. 左右两侧都有菜单;

  2. 根据ViewType显示菜单;

  3. 长按拖拽Item(List),与菜单结合;

  4. 长按拖拽Item(Grid);

  5. 滑动删除Item;

  6. 指定某个Item不能拖拽或者不能滑动删除;

  7. 用SwipeMenuLayout实现你自己的侧滑。


项目地址:

https://github.com/jdsjlzx/LRecyclerView


SwipeMenuAdapter


为了实现 SwipeMenu 的功能,此次新增了一个 SwipeMenuAdapter 类。


SwipeMenuAdapter library 中已经存在的 LRecyclerViewAdapter 会不会冲突呢?答案是不会。SwipeMenuAdapter 是用户级别的基类adapter,也就是用户需要继承 SwipeMenuAdapter 去实现自己的adapter,还像之前那样使用即可。


SwipeMenuAdapter 类的定义:


public abstract class SwipeMenuAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>


实现自己的 MenuAdapter


进击的RecyclerView——LRecyclerView


是不是很方便?MenuAdapter 基本的功能都满足了,直接拷贝到项目中即可使用。


上面说了那么多,关键的也就这几句:


mDataAdapter = new MenuAdapter();
mDataAdapter.setDataList(dataList);
mLRecyclerViewAdapter = new LRecyclerViewAdapter(this, mDataAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);


下面具体分析每个功能。


左右两侧菜单


效果图:


进击的RecyclerView——LRecyclerView


具体使用步骤如下:


SwipeRecyclerView Item 创建菜单


// 设置菜单创建器
mRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
// 设置菜单Item点击监听事件
mRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);


其中 swipeMenuCreator menuItemClickListener 代码如下:


进击的RecyclerView——LRecyclerView


从上面代码可以看出,swipeMenuCreator 完成了左右菜单的创建,menuItemClickListener 实现了菜单的点击事件。


需要注意的是,LRecyclerView 提供了下面两个方法,具体使用请详见demo。


进击的RecyclerView——LRecyclerView


  • openLeftMenu:打开item的左边菜单 

  • openRightMenu:打开item的右边菜单


这里关键的就是这个 position(详细请参考demo),先埋下个伏笔,后面介绍。


根据ViewType显示菜单


效果图:


进击的RecyclerView——LRecyclerView


根据 ViewType 决定 SwipeMenu 在哪一行出现,可以左侧,可以右侧。


自定义 MenuViewTypeAdapter,代码如下:


进击的RecyclerView——LRecyclerView


在实现 swipeMenuCreator 时,需要根据 ItemViewType 值来决定是否创建左右菜单。


进击的RecyclerView——LRecyclerView


长按拖拽(List),与菜单结合


效果图:


进击的RecyclerView——LRecyclerView


关键代码:


// 开启拖拽功能
mRecyclerView.setLongPressDragEnabled(true);
// 监听拖拽,更新UI
mRecyclerView.setOnItemMoveListener(onItemMoveListener);


onItemMoveListener 具体如下:


进击的RecyclerView——LRecyclerView


注意下面代码:


final int adjFromPosition = mLRecyclerViewAdapter.getAdapterPosition(true, fromPosition);
final int adjToPosition = mLRecyclerViewAdapter.getAdapterPosition(true, toPosition);


关于 position 的位置,为了大家使用方便,特在 LRecyclerViewAdapter 中提供了一个方法 getAdapterPosition(boolean isCallback, int position)


  • isCallback 含义:position 是否接口回调中带来的


  • position 含义:如果不是接口回调,就是用户自己指定的 position


  • getAdapterPosition(boolean isCallback, int position) 只用于 LRecyclerViewAdapter 提供的接口。


举例说明:


  • setOnItemMoveListener 不是 LRecyclerViewAdapter 自带接口(也就是内部方法),需要调用 getAdapterPosition方法 获得正确的 position


  • setOnItemClickLitener LRecyclerViewAdapter 自带接口,接口里面自带了 position,用户就不必调用 getAdapterPosition方法,直接使用就可以了。


进击的RecyclerView——LRecyclerView


长按拖拽Item(Grid)


效果图:


进击的RecyclerView——LRecyclerView


list 功能一样,只是布局不一样。


滑动直接删除Item


效果图:


进击的RecyclerView——LRecyclerView


注意:滑动删除和滑动菜单是互相冲突的,两者只能出现一个。


关键代码:


mRecyclerView.setLongPressDragEnabled(true);
// 开启滑动删除
mRecyclerView.setItemViewSwipeEnabled(true);
// 监听拖拽,更新UI
mRecyclerView.setOnItemMoveListener(onItemMoveListener);


按照配置就可以实现滑动删除。


指定Item不能拖拽或不能滑动删除


效果图:


进击的RecyclerView——LRecyclerView


关键代码:


mRecyclerView.setLongPressDragEnabled(true);
// 开启滑动删除
mRecyclerView.setItemViewSwipeEnabled(true);
// 监听拖拽,更新UI
mRecyclerView.setOnItemMoveListener(onItemMoveListener); mRecyclerView.setOnItemMovementListener(onItemMovementListener);


其中,onItemMovementListener 具体实现如下:


进击的RecyclerView——LRecyclerView


onItemMoveListener 具体实现如下:


进击的RecyclerView——LRecyclerView


通过代码中的注释,就可以明白了,一切尽在代码中。


用SwipeMenuLayout实现侧滑


效果图:


进击的RecyclerView——LRecyclerView


这个与 LRecyclerView 关系不大,但是与 SwipeMenu 关系密切。为了实现滑动菜单的功能,定义了 SwipeMenuLayout


SwipeMenuLayout 类的定义:


public class SwipeMenuLayout extends FrameLayout implements SwipeSwitch


在开头提到的 SwipeMenuAdapter


进击的RecyclerView——LRecyclerView


layout_recyclerview_swipe_item_default.xml:


进击的RecyclerView——LRecyclerView


看来这个布局,你是不是有种恍然大悟的感觉呢?左右滑动就是通过SwipeMenuView 来实现的。


项目地址,欢迎Star:

https://github.com/jdsjlzx/LRecyclerView




进击的RecyclerView——LRecyclerView


如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。


欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

进击的RecyclerView——LRecyclerView