Android中如何快速的实现RecycleView的拖动重排序功能

本文首发于公众号"AntDream",欢迎微信搜索"AntDream"或扫描文章底部二维码关注,和我一起每天进步一点点

要实现这个拖动重排序功能,主要是用到了RecycleView的ItemTouchHelper类

首先是定义一个接口

kotlin 复制代码
interface ItemTouchHelperAdapter {
    fun onItemMove(fromPosition: Int, toPosition: Int)
}

然后我们的Adapter里面要实现这个接口

kotlin 复制代码
import androidx.recyclerview.widget.RecyclerView
import java.util.*

class MyAdapter(private val items: MutableList<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>(), ItemTouchHelperAdapter {

    // ... ViewHolder and other methods ...

    override fun onItemMove(fromPosition: Int, toPosition: Int) {
        if (fromPosition < toPosition) {
            for (i in fromPosition until toPosition) {
                Collections.swap(items, i, i + 1)
            }
        } else {
            for (i in fromPosition downTo toPosition + 1) {
                Collections.swap(items, i, i - 1)
            }
        }
        notifyItemMoved(fromPosition, toPosition)
    }
}

实现ItemTouchHelper的Callback接口方法

kotlin 复制代码
class SimpleItemTouchHelperCallback(private val adapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback() {

    override fun isLongPressDragEnabled() = true

    override fun isItemViewSwipeEnabled() = false

    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
    	//这里是水平拖动
        val dragFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
        return makeMovementFlags(dragFlags, 0)
    }

    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        adapter.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        // do nothing
    }
}

其中控制拖动方向的主要是在getMovementFlags方法中的dragFlags参数

如果是水平拖动,则用

kotlin 复制代码
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT

如果是竖直方向上拖动,则是用

kotlin 复制代码
ItemTouchHelper.UP or ItemTouchHelper.DOWN

最后绑定到我们的RecycleView上

kotlin 复制代码
val adapter = MyAdapter(myDataset)
val recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view)
recyclerView.adapter = adapter

val callback = SimpleItemTouchHelperCallback(adapter)
val touchHelper = ItemTouchHelper(callback)
touchHelper.attachToRecyclerView(recyclerView)

完成以上的步骤就瞬间实现了让RecycleView支持拖动重排序的功能


欢迎关注我的公众号AntDream查看更多精彩文章!

相关推荐
LCG元5 小时前
【面试问题】JIT 是什么?和 JVM 什么关系?
面试·职场和发展
拭心8 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
GISer_Jing10 小时前
2025前端面试热门题目——计算机网络篇
前端·计算机网络·面试
m0_7482455210 小时前
吉利前端、AI面试
前端·面试·职场和发展
带电的小王10 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡10 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道11 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
TodoCoder11 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
阿甘知识库12 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道12 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频