Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何启用拖放并允许用户自定义排序?_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android 如何启用拖放并允许用户自定义排序?

Android 如何启用拖放并允许用户自定义排序?,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我有一个RecyclerView,它是一个用户输入的“步骤”列表,这些步骤可以按用户希望的任何顺序拖放。我有一个显示适配器位置(步骤顺序)的文本视图,但我很难在拖放后保持更新 使用ItemTouchHelper,我有以下几点: override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { val

我有一个RecyclerView,它是一个用户输入的“步骤”列表,这些步骤可以按用户希望的任何顺序拖放。我有一个显示适配器位置(步骤顺序)的文本视图,但我很难在拖放后保持更新

使用
ItemTouchHelper
,我有以下几点:

override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean
{
    val fromPosition = viewHolder.adapterPosition
    val toPosition = target.adapterPosition
    if(fromPosition < toPosition)
    {
        for(i in fromPosition until toPosition)
        {
            Collections.swap(data, i, i + 1)
            data[toPosition].number = toPosition.toLong()
            data[fromPosition].number = fromPosition.toLong()
        }
    }
    else
    {
        for(i in toPosition downTo fromPosition)
        {
            Collections.swap(data, i, i - 1)
            data[toPosition].number = toPosition.toLong()
            data[fromPosition].number = fromPosition.toLong()
        }
    }
    notifyItemMoved(fromPosition, toPosition)
    notifyItemChanged(toPosition)
    notifyItemChanged(fromPosition)
    return true
}
override-fun-onMove(recyclerView:recyclerView,viewHolder:recyclerView.viewHolder,target:recyclerView.viewHolder):布尔值
{
val fromPosition=viewHolder.adapterPosition
val toPosition=target.adapterPosition
如果(从位置<位置)
{
用于(从起始位置到位置的i)
{
集合.交换(数据,i,i+1)
数据[toPosition].number=toPosition.toLong()
数据[fromPosition].number=fromPosition.toLong()
}
}
其他的
{
用于(i处于从位置向下到从位置的位置)
{
集合.交换(数据,i,i-1)
数据[toPosition].number=toPosition.toLong()
数据[fromPosition].number=fromPosition.toLong()
}
}
notifyItemMoved(从位置、位置)
已更改的项目(位置)
notifyItemChanged(fromPosition)
返回真值
}

但是,如果我将任何项目拖到第一个位置,并且EditText中的数据不会在移动或复制到另一个EditText中时保持不变,则会引发IndexOutOfBoundsException。

for循环中出现错误

for(i in toPosition downTo fromPosition)
应该是

for(i in fromPosition downTo toPosition )

解决方案

我是个白痴,想在跑之前飞起来。如果我在测试和运行它之前没有对上面的代码进行修改,除了在notifyItemMoved()之后调用notifyItemChanged(),因为数字取决于ViewHolder的适配器位置之外,上面的代码本来可以很好地工作。我所要做的就是不在Collections.swap()之后放任何代码。现在,订购功能可以完美地工作

if (fromPosition < toPosition)
    {
        for (i in fromPosition until toPosition)
        {
            swap(data, i, i + 1)
        }
    } else
    {
        for (i in fromPosition downTo toPosition + 1)
        {
            swap(data, i, i - 1)
        }
    }
    notifyItemMoved(fromPosition, toPosition)
    notifyItemChanged(toPosition)
    notifyItemChanged(fromPosition)
    return true
if(fromPosition
好的,修复了IndexOutOfBoundsException,谢谢。我仍然有跨视图复制的数据。我尝试了1)Collections.swap 2)只交换步骤号,但EditText数据仍然会在数据之间(特别是被交换的数据)创建副本。