我遇到了一个问题,那就是在我的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)