查看原文
其他

牛逼了,轻松实现RecyclerView 拖动多选功能

码农西哥 技术最TOP 2022-08-27

点击上方“Android技术杂货铺”,选择“标星”

干货文章,第一时间送达!


文件选择在我们日常开发中是一个比较常见的功能,分为文件单选和多选,单选比如头像上传,多选比如相册中的多图选择、多文件选择删除等。在Android开发中,系统为我们提供了单选/多选的控件,单选用RadioButton/RadioGroup(🔘),多选则用CheckBox(☑️)。这些都是比较基础的,相信才入门的应该都会已掌握。

抛开单选不说,今天来说说文件多选,在APP上,多选其实使用起来比较麻烦,我们的一个一个地勾选Checkbox(☑️),如果文件有几十个,是不是非常耗费时间?体验也不好,其实在pc 端是不存在这个问题,在pc 端,我们只需拖动鼠标,就能一下将我们需要选择的多个文件选中。APP是能像pc 一样拖动来实现多选吗?答案是肯定的,今天就为大家介绍一个牛逼的库,drag-select-recyclerview,可以轻松实现recyclerView 拖动多选。

drag-select-recyclerview

github地址: https://github.com/afollestad/drag-select-recyclerview

如果你使用过google 相册,相信你记得它有一个非常方便的功能,就是选择多张图片的时候,可以在屏幕上拖动手指来完成照片多选。drag-select-recyclerview 就能让你在自己的app中轻松实现这个功能。

DragSelectTouchListener 是这个库的核心类,该库将会处理拖动事件拦截和自动滚动逻辑,当拖动到recyclerView 顶部的时候,列表将继续滚动,反之亦然。

使用的时候,将DragSelectTouchListener attache 到 RecyclerView,它将会处理触摸事件的拦截,然后通过一个receiver 来返回结果和更新UI。

val receiver: DragSelectReceiver = // ...
val touchListener = DragSelectTouchListener.create(context, receiver)

效果图



                                          

如何使用?

添加依赖:

dependencies {

implementation 'com.afollestad:drag-select-recyclerview:2.4.0'
}

receiver代码如下:

class MyReceiver : DragSelectReceiver {

override fun setSelected(index: Int, selected: Boolean) {
// do something to mark this index as selected/unselected
if(selected && !selectedIndices.contains(index)) {
selectedIndices.add(index)
} else if(!selected) {
selectedIndices.remove(index)
}
}

override fun isSelected(index: Int): Boolean {
// return true if this index is currently selected
return selectedItems.contains(index)
}

override fun isIndexSelectable(index: Int): Boolean {
// if you return false, this index can't be used with setIsActive()
return true
}

override fun getItemCount(): Int {
// return size of your data set
return 0
}
}

DragSelectReceiver 是一个接口,在实际应用中,我们可以让Adapter 实现DragSelectReceiver,这样,记录选中与未选中就很方便。

结合RecyclerView使用如下:

val recyclerView: RecyclerView = // ...
val receiver: DragSelectReceiver = // ...

val touchListener = DragSelectTouchListener.create(context, receiver)
recyclerView.addOnItemTouchListener(touchListener) // important!!

// true for active = true, 0 is the initial selected index
touchListener.setIsActive(true, 0)

通过设置setIsActive ,当用户长按列表Item时,触发事件开始拖动选择。

更多使用方法请看Github,或者运行Demo查看。

是不是很酷?赶快引入自己的项目试试吧!

---end---

推荐阅读:

Android 实现滴滴出行App功能

一行代码搞定 Android平台React Native Modal 无法延伸到状态栏的问题

Android异步消息处理机制解析

每一个“在看”,我都当成真的喜欢

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存