繁体   English   中英

从 Recyclerview + 本地数据库中删除项目 [Kotlin]

[英]Delete an Item from the Recyclerview + Local database [Kotlin]

我正在使用“滑动删除”从 Recyclerview 和本地数据库中删除一个项目。 如果我触摸回收站视图中的项目并将其拉到右上角 - 一个带有问题“我应该删除您的项目吗?”的 AlertDialog 会出现。 只要我按“是”,该项目就应该被删除。 至今...

两周前,这个 function 运行良好。 但是,如果我现在按“是”,整个应用程序就会崩溃。 (我已经拥有最新的 Andorid Studio 版本,我没有更改代码中的任何内容。除此之外,我的 Logcat 说问题是“ adapter.removeAt(viewHolder.adapterPosition) ”但我实际上不知道如何找到更好的解决方案。

PS:没有 AlertDialog 删除 function 工作完美。 所以也许 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$1$onSwiped$1.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 将暂停,并可能导致类似这样的一些意外行为,请在打开对话框之前尝试存储 position

        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()
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM