我遇到了一个问题,那就是在我的Recical erView适配器中实现onRowMoved函数.

此函数负责在项目被拖放时处理RecEconerView中的项目移动.

但是,我遇到了一个java.lang.IndexOutOf边界异常.


我的代码是:


val touchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {

    ...

    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        return imagesAdapter?.onRowMoved(viewHolder, target) ?: false
    }

})

fun onRowMoved(
    fromViewHolder: RecyclerView.ViewHolder,
    toViewHolder: RecyclerView.ViewHolder
): Boolean {
    val fromPosition = fromViewHolder.bindingAdapterPosition
    val toPosition = toViewHolder.bindingAdapterPosition
    val imagesSize = this.images.size

    if (fromPosition < imagesSize && toPosition < imagesSize) {
        if (fromPosition < toPosition) {
            for (i in fromPosition until toPosition) {
                Collections.swap(this.images, i, i + 1)
            }
            notifyItemMoved(fromPosition, toPosition)
        } else {
            for (i in fromPosition downTo toPosition + 1) {
                Collections.swap(this.images, i, i - 1)
            }
            notifyItemMoved(toPosition, fromPosition)
        }

        Handler().postDelayed({
            notifyDataSetChanged()
        }, 1000)
        return true
    }
    return false
}

崩溃日志(log)如下:

Fatal Exception: java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 8
       at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
       at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
       at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
       at java.util.Objects.checkIndex(Objects.java:359)
       at java.util.ArrayList.get(ArrayList.java:434)
       at java.util.Collections.swap(Collections.java:548)
       at com....newProduct.NewProductImagesAdapter.onRowMoved(NewProductImagesAdapter.kt:208)
       at com....newProduct.NewProduct$createImagesAdapter$touchHelper$1.onMove(NewProduct.kt:927)
       at androidx.recyclerview.widget.ItemTouchHelper.moveIfNecessary(ItemTouchHelper.java:891)
       at androidx.recyclerview.widget.ItemTouchHelper$2.onTouchEvent(ItemTouchHelper.java:390)
       at androidx.recyclerview.widget.RecyclerView.dispatchToOnItemTouchListeners(RecyclerView.java:3515)
       at androidx.recyclerview.widget.RecyclerView.onTouchEvent(RecyclerView.java:3713)
       at android.view.View.dispatchTouchEvent(View.java:14879)

推荐答案

看起来您正在使用bindingAdapterPosition来获取ViewHolder的适配器位置,但请记住,如果ViewHolder当前不在适配器中,bindingAdapterPosition可以返回NO_POSITION.移动项目时,受影响项目的适配器位置可能会更改.

fun onRowMoved(
fromViewHolder: RecyclerView.ViewHolder,
toViewHolder: RecyclerView.ViewHolder
Boolean {
val fromPosition = fromViewHolder.adapterPosition
val toPosition = toViewHolder.adapterPosition
val imagesSize = this.images.size

if (fromPosition != RecyclerView.NO_POSITION && toPosition != 
RecyclerView.NO_POSITION &&
    fromPosition < imagesSize && toPosition < imagesSize
) {
    if (fromPosition < toPosition) {
        for (i in fromPosition until toPosition) {
            Collections.swap(this.images, i, i + 1)
        }
        notifyItemMoved(fromPosition, toPosition)
    } else {
        for (i in fromPosition downTo toPosition + 1) {
            Collections.swap(this.images, i, i - 1)
        }
        notifyItemMoved(fromPosition, toPosition)
    }

    Handler().postDelayed({
        notifyDataSetChanged()
    }, 1000)
    return true
}
return false

}

Java相关问答推荐

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

为什么我的画布没有显示在PFA应用程序中?

在Java中将Charsequence数组更改为String数组或List String<>

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

Chunk(Int)已弃用并标记为要删除

Java:使用Class.cast()将对象转换为原始数组

如何修复PDF重建过程中的文本定位

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

搜索列表返回多个频道

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

使用Jackson库反序列化json

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

为什么在下面的Java泛型方法中没有类型限制?

Java中HashSet的搜索时间与TreeSet的搜索时间

视图被推出线性布局-Android

Java类型推断:为什么要编译它?

为什么Spring要更改Java版本配置以及如何正确设置?