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