从 Recyclerview + 本地数据库 [Kotlin] 中删除项目
Delete an Item from the Recyclerview + Local database [Kotlin]
我正在使用“滑动删除”从 Recyclerview 和本地数据库中删除项目。如果我触摸回收站视图中的项目并将其拉到右角 - 一个带有问题“我应该删除你的项目吗?”的 AlertDialog。会出现。我一按“是”,该项目就应该被删除。到目前为止...
两周前这个功能完美运行。但是,如果我现在按“是”,整个应用程序就会崩溃。 (我已经有了最新的 Andorid Studio 版本,我没有更改代码中的任何内容。除此之外,我的 Logcat 说问题是“adapter.removeAt(viewHolder.adapterPosition)" 但我其实不知道如何找到更好的解决方案。
PS: 如果没有 AlertDialog,删除功能将完美运行。所以也许 AlertDialog 有问题? (但我需要类似 AlertDialog 的东西)
如果有人能帮助我,那就太棒了。
我的代码:
MainActivity(显示我的 Recyclerview 的地方)
fun setupTaskRecyclerView(tasklist: ArrayList<TaskModel>){
rv_task_view.layoutManager = LinearLayoutManager(this)
rv_task_view.setHasFixedSize(true)
tasklist.sortByDescending { it.id }
val taskAdapter = TaskAdapter(this, tasklist )
rv_task_view.adapter = taskAdapter
//SwipeToDelete-----------
val deleteSwipeHandler = object : SwipeToDeleteCallback(this){
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val adapter = rv_task_view.adapter as TaskAdapter
var test = false
AlertDialog.Builder(this@MainActivity)
.setCancelable(false)
.setTitle("Delete entry")
.setMessage("Should I delete your item?")
.setPositiveButton("YES"){
_, _ ->
adapter.removeAt(viewHolder.adapterPosition)
getTaskListFromLocalDatabase()
}
.setNegativeButton("NO"){
dialog, _ ->
dialog.dismiss()
getTaskListFromLocalDatabase()
}.show()
//adapter.removeAt(viewHolder.adapterPosition)
getTaskListFromLocalDatabase()
}
}
val deleteItemTouchHelper = ItemTouchHelper(deleteSwipeHandler)
deleteItemTouchHelper.attachToRecyclerView(rv_task_view)
//-----------SwipeToDelete
}
在我的本地数据库中
fun removeAt( position: Int){
val dbHandler = DatabaseHandler(context)
val isDeleted = dbHandler.deleteTask(list[position])
if (isDeleted > 0){
list.removeAt(position)
notifyItemRemoved(position)
}
}
Logcat 说:
2021-04-12 22:15:33.976 18122-18122/com.example.to_do E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.to_do, PID: 18122
java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.get(ArrayList.java:439)
at TaskAdapter.removeAt(TaskAdapter.kt:182) //--> is this val isDeleted = dbHandler.deleteTask(list[position])
at com.example.to_do.Activity.MainActivity$setupTaskRecyclerView$deleteSwipeHandler$onSwiped.onClick(MainActivity.kt:250) // --> is adapter.removeAt(viewHolder.adapterPosition)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:177)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2021-04-12 22:15:40.314 18122-18135/com.example.to_do W/System: 资源调用关闭失败。
如警报对话框所示,您 window 将暂停,这可能会导致一些意外行为,如
打开对话框之前尝试存储位置
val targetPosition = viewHolder.adapterPosition
AlertDialog.Builder(this@MainActivity)
.setCancelable(false)
.setTitle("Delete entry")
.setMessage("Should I delete your item?")
.setPositiveButton("YES"){
_, _ ->
adapter.removeAt(targetPosition) //use it here
getTaskListFromLocalDatabase()
}
我正在使用“滑动删除”从 Recyclerview 和本地数据库中删除项目。如果我触摸回收站视图中的项目并将其拉到右角 - 一个带有问题“我应该删除你的项目吗?”的 AlertDialog。会出现。我一按“是”,该项目就应该被删除。到目前为止...
两周前这个功能完美运行。但是,如果我现在按“是”,整个应用程序就会崩溃。 (我已经有了最新的 Andorid Studio 版本,我没有更改代码中的任何内容。除此之外,我的 Logcat 说问题是“adapter.removeAt(viewHolder.adapterPosition)" 但我其实不知道如何找到更好的解决方案。
PS: 如果没有 AlertDialog,删除功能将完美运行。所以也许 AlertDialog 有问题? (但我需要类似 AlertDialog 的东西)
如果有人能帮助我,那就太棒了。
我的代码: MainActivity(显示我的 Recyclerview 的地方)
fun setupTaskRecyclerView(tasklist: ArrayList<TaskModel>){
rv_task_view.layoutManager = LinearLayoutManager(this)
rv_task_view.setHasFixedSize(true)
tasklist.sortByDescending { it.id }
val taskAdapter = TaskAdapter(this, tasklist )
rv_task_view.adapter = taskAdapter
//SwipeToDelete-----------
val deleteSwipeHandler = object : SwipeToDeleteCallback(this){
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val adapter = rv_task_view.adapter as TaskAdapter
var test = false
AlertDialog.Builder(this@MainActivity)
.setCancelable(false)
.setTitle("Delete entry")
.setMessage("Should I delete your item?")
.setPositiveButton("YES"){
_, _ ->
adapter.removeAt(viewHolder.adapterPosition)
getTaskListFromLocalDatabase()
}
.setNegativeButton("NO"){
dialog, _ ->
dialog.dismiss()
getTaskListFromLocalDatabase()
}.show()
//adapter.removeAt(viewHolder.adapterPosition)
getTaskListFromLocalDatabase()
}
}
val deleteItemTouchHelper = ItemTouchHelper(deleteSwipeHandler)
deleteItemTouchHelper.attachToRecyclerView(rv_task_view)
//-----------SwipeToDelete
}
在我的本地数据库中
fun removeAt( position: Int){
val dbHandler = DatabaseHandler(context)
val isDeleted = dbHandler.deleteTask(list[position])
if (isDeleted > 0){
list.removeAt(position)
notifyItemRemoved(position)
}
}
Logcat 说:
2021-04-12 22:15:33.976 18122-18122/com.example.to_do E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.to_do, PID: 18122
java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.get(ArrayList.java:439)
at TaskAdapter.removeAt(TaskAdapter.kt:182) //--> is this val isDeleted = dbHandler.deleteTask(list[position])
at com.example.to_do.Activity.MainActivity$setupTaskRecyclerView$deleteSwipeHandler$onSwiped.onClick(MainActivity.kt:250) // --> is adapter.removeAt(viewHolder.adapterPosition)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:177)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2021-04-12 22:15:40.314 18122-18135/com.example.to_do W/System: 资源调用关闭失败。
如警报对话框所示,您 window 将暂停,这可能会导致一些意外行为,如
打开对话框之前尝试存储位置 val targetPosition = viewHolder.adapterPosition
AlertDialog.Builder(this@MainActivity)
.setCancelable(false)
.setTitle("Delete entry")
.setMessage("Should I delete your item?")
.setPositiveButton("YES"){
_, _ ->
adapter.removeAt(targetPosition) //use it here
getTaskListFromLocalDatabase()
}