【问题标题】:How to make the RecyclerView's ItemTouchHelper work on only part of the list(drag & drop)如何使 RecyclerView 的 ItemTouchHelper 仅在列表的一部分上工作(拖放)
【发布时间】:2021-02-04 12:43:53
【问题描述】:

我使用 RecyclerView 的 ItemTouchHelper 来更改顺序(拖放),我只想移动列表的一部分。 我不想在某个索引之后移动。如何用一个 RecyclerView 处理它?

如果我再解释一下我想要做什么, 活动项目向上排序,非活动项目向下排序。只有激活的项目才会改变顺序。 现在,当我拖动一个活动项时,它会下降到非活动项的区域,但我想防止它下降。我该怎么做?

更新

open class SimpleItemTouchHelperCallback(private val mAdapter: ItemTouchHelperAdapter) :
    ItemTouchHelper.Callback() {

    private var isLongPressDrag = true

    fun setLongPressDragEnable(isLongPressDrag: Boolean) {
        this.isLongPressDrag = isLongPressDrag
    }

    override fun isLongPressDragEnabled() = isLongPressDrag

    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
        val swipeFlags = 0
        return makeMovementFlags(dragFlags, swipeFlags)
    }

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

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) {
        mAdapter.onItemDismiss(viewHolder.adapterPosition)
    }

}

【问题讨论】:

    标签: android android-recyclerview itemtouchhelper


    【解决方案1】:

    使用ItemTouchHelper.SimpleCallback 并覆盖getDragDirsonMove 方法:

    ItemTouchHelper.SimpleCallback(
            UP or DOWN,
            0
    ) {
        override fun getDragDirs(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
            val selectedPosition = viewHolder.adapterPosition
            val isActive: Boolean = // retrieve your model from list and check its active state
            return if (isActive) super.getDragDirs(recyclerView, viewHolder) else 0
        }
        override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder,
        ): Boolean {
            val toPosition = target.adapterPosition
            val isActiveTarget: Boolean = // retrieve your target model from list and check its active state
            if (!isActiveTarget) return false
            val fromPosition = viewHolder.adapterPosition
            moveItem(fromPosition, toPosition)
            return true
        }
    }
    

    getDragDirs 上返回0 可防止不活动的项目选择,而在onMove 上返回false 可防止项目拖动时移动

    【讨论】:

    • 非常感谢您的回答。但我已经在使用 ItemtouchHelper.Callback。我应该创建另一个使用 SimpleCallback 的类来使用 getDragDir 吗?
    • 不客气。是的,因为 ItemTouchHelper.SimpleCallback 在内部扩展了 ItemtouchHelper.Callback 本身,您只需要使用简单的回调来使用其功能,例如 getDragDirs,同时具有回调主要功能。
    • 有什么方法可以从现有回调中调用简单回调上的 getDragdir 吗?我想保留我定制的东西..
    • getDragDirs 是在ItemTouchHelper.SimpleCallback 中声明的开放方法,但是您可以通过声明自己的方法并覆盖ItemtouchHelper.CallbackgetMovementFlags 来调用它并返回正确的值来模仿它的行为。用您的代码更新您的问题,以便我可以帮助您实现它。
    • 谢谢 :) 我添加了 itemTouchHelper.callback 的代码。由于回调正在其他地方使用,我想将 getDragDir 函数添加到回调中而不进行新的回调。请帮忙。
    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 2023-03-11
    • 2016-05-18
    • 2017-02-05
    • 1970-01-01
    • 2021-01-15
    • 2019-12-08
    • 2019-03-23
    相关资源
    最近更新 更多