进击的RecyclerView——LRecyclerView
本篇来自 一叶飘舟 (也是一位****大神)再次投稿,在他原作的基础上进行了大幅度升级,之前就很受大家欢迎,希望依旧给你们带来惊喜。
读完本文大概需要8分钟~~~eh~~~或许还要再久点。。。
一叶飘舟 的博客地址:
http://blog.****.net/jdsjlzx
如果你之前没有听说过 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 系列功能描述如下:
左右两侧都有菜单;
根据ViewType显示菜单;
长按拖拽Item(List),与菜单结合;
长按拖拽Item(Grid);
滑动删除Item;
指定某个Item不能拖拽或者不能滑动删除;
用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:
是不是很方便?MenuAdapter 基本的功能都满足了,直接拷贝到项目中即可使用。
上面说了那么多,关键的也就这几句:
mDataAdapter = new MenuAdapter();
mDataAdapter.setDataList(dataList);
mLRecyclerViewAdapter = new LRecyclerViewAdapter(this, mDataAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);
下面具体分析每个功能。
左右两侧菜单
效果图:
具体使用步骤如下:
为 SwipeRecyclerView 的 Item 创建菜单
// 设置菜单创建器
mRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
// 设置菜单Item点击监听事件
mRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);
其中 swipeMenuCreator 和 menuItemClickListener 代码如下:
从上面代码可以看出,swipeMenuCreator 完成了左右菜单的创建,menuItemClickListener 实现了菜单的点击事件。
需要注意的是,LRecyclerView 提供了下面两个方法,具体使用请详见demo。
openLeftMenu:打开item的左边菜单
openRightMenu:打开item的右边菜单
这里关键的就是这个 position(详细请参考demo),先埋下个伏笔,后面介绍。
根据ViewType显示菜单
效果图:
根据 ViewType 决定 SwipeMenu 在哪一行出现,可以左侧,可以右侧。
自定义 MenuViewTypeAdapter,代码如下:
在实现 swipeMenuCreator 时,需要根据 ItemViewType 值来决定是否创建左右菜单。
长按拖拽(List),与菜单结合
效果图:
关键代码:
// 开启拖拽功能
mRecyclerView.setLongPressDragEnabled(true);
// 监听拖拽,更新UI
mRecyclerView.setOnItemMoveListener(onItemMoveListener);
onItemMoveListener 具体如下:
注意下面代码:
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方法,直接使用就可以了。
长按拖拽Item(Grid)
效果图:
与 list 功能一样,只是布局不一样。
滑动直接删除Item
效果图:
注意:滑动删除和滑动菜单是互相冲突的,两者只能出现一个。
关键代码:
mRecyclerView.setLongPressDragEnabled(true);
// 开启滑动删除
mRecyclerView.setItemViewSwipeEnabled(true);
// 监听拖拽,更新UI
mRecyclerView.setOnItemMoveListener(onItemMoveListener);
按照配置就可以实现滑动删除。
指定Item不能拖拽或不能滑动删除
效果图:
关键代码:
mRecyclerView.setLongPressDragEnabled(true);
// 开启滑动删除
mRecyclerView.setItemViewSwipeEnabled(true);
// 监听拖拽,更新UI
mRecyclerView.setOnItemMoveListener(onItemMoveListener);
mRecyclerView.setOnItemMovementListener(onItemMovementListener);
其中,onItemMovementListener 具体实现如下:
onItemMoveListener 具体实现如下:
通过代码中的注释,就可以明白了,一切尽在代码中。
用SwipeMenuLayout实现侧滑
效果图:
这个与 LRecyclerView 关系不大,但是与 SwipeMenu 关系密切。为了实现滑动菜单的功能,定义了 SwipeMenuLayout。
SwipeMenuLayout 类的定义:
public class SwipeMenuLayout extends FrameLayout implements SwipeSwitch
在开头提到的 SwipeMenuAdapter 的
layout_recyclerview_swipe_item_default.xml:
看来这个布局,你是不是有种恍然大悟的感觉呢?左右滑动就是通过SwipeMenuView 来实现的。
项目地址,欢迎Star:
https://github.com/jdsjlzx/LRecyclerView
如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。
欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: