前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android如何简单快速实现RecycleView的拖动重排序功能

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

作者头像
AntDream
发布2024-06-24 20:16:01
650
发布2024-06-24 20:16:01
举报

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

首先是定义一个接口

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

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

代码语言:javascript
复制
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接口方法

代码语言:javascript
复制
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参数

如果是水平拖动,则用

代码语言:javascript
复制
ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT

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

代码语言:javascript
复制
ItemTouchHelper.UP or ItemTouchHelper.DOWN

最后绑定到我们的RecycleView上

代码语言:javascript
复制
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支持拖动重排序的功能。

赶快动手试试吧!

作者介绍

中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机

越努力越幸运,加油💪,一起遇见更好的自己

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先是定义一个接口
  • 然后我们的Adapter里面要实现这个接口
  • 实现ItemTouchHelper的Callback接口方法
  • 最后绑定到我们的RecycleView上
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档