微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从我的 recyclerView 中删除最后一项不起作用?

如何解决从我的 recyclerView 中删除最后一项不起作用?

大家好,我创建了一个 reccyclerView,在我的 recyclerView 中,我可以从 sqlite 数据库和 recyclerView 本身添加删除项目,一切正常,但是当我尝试删除最后一个项目时,应用程序崩溃了,我得到了 Java .Lang.indexoutofboundsexception 索引:0 大小:0。但最后一项已从我的 sqlite 数据库中成功删除

这是我的 RecyclerViewAdapter


    inner class ViewHolder(val binding: LevelLayoutBinding) : RecyclerView.ViewHolder(binding.root),View.OnClickListener,View.OnLongClickListener {
        init {
            itemView.setonClickListener(this)
            itemView.setonLongClickListener(this)
        }
        override fun onClick(v: View?) {
            val position = adapterPosition
            listener.onItemClick(position)
        }

        override fun onLongClick(v: View?): Boolean {
            val position = adapterPosition
            if (v != null) {
                listener.onLongClick(position,v)
            }
            return true
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
        val v = LevelLayoutBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(holder: ViewHolder,position: Int) {
        holder.binding.tvLevel.text = todoList[position].name
    }

    override fun getItemCount(): Int {
        return todoList.size
    }

    fun deleteItem(position: Int) {
        todoList.removeAt(position)
        notifyItemRemoved(position)
        notifyDataSetChanged()
        if(todoList.size==0){
            todoList.clear()
        }
    }

    interface OnItemClickListener {
        fun onItemClick(position: Int)
        fun onLongClick(position: Int,view: View)
    }

在我的 MainActivity 中:


override fun onLongClick(position: Int,view: View) {
        val customDialog = Dialog(this)
        customDialog.setContentView(R.layout.dialog_custom)

        val tvDelete = customDialog.findViewById<TextView>(R.id.tvDelete)
       
        tvDelete.setonClickListener {
            val id = MyDBHelper(this).readAllData()
            val myList = LevelModelClass(id[position].id,"")

            MyDBHelper(this).deleteLabel(myList)
            
            LevelAdapter(getItemList(),this).deleteItem(position)

            recyclerViewSetUp()

            customDialog.dismiss()
        }

 private fun recyclerViewSetUp() {
        if(getItemList().size > 0) {
            binding.rvLevel.layoutManager = GridLayoutManager(this,2)
            binding.rvLevel.adapter = LevelAdapter(getItemList(),this)

        }
    }

    private fun getItemList(): ArrayList<LevelModelClass> {
        val myDB = MyDBHelper(this)
        return myDB.readAllData()
    }

这是堆栈跟踪


E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.teamup.projecttwo,PID: 28358
    java.lang.indexoutofboundsexception: Index: 0,Size: 0
        at java.util.ArrayList.remove(ArrayList.java:503)
        at com.teamup.projecttwo.LevelAdapter.deleteItem(RecyclerViewAdapter.kt:46)
        at com.teamup.projecttwo.MainActivity$onLongClick$1.onClick(MainActivity.kt:69)
        at android.view.View.performClick(View.java:6608)
        at android.view.View.performClickInternal(View.java:6585)
        at android.view.View.access$3100(View.java:785)
        at android.view.View$PerformClick.run(View.java:25921)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6864)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

提前致谢:)

解决方法

这是@cactustictacs 的帮助下的答案:)

RecyclerViewAdapter 中将您的 deleteItem 函数更改为:

try/except

MainActivity 中,当点击 tvDelete 时执行以下代码:

fun deleteItem(position: Int) {

        if(todoList.isNotEmpty() && todoList.size > position) {
            todoList.removeAt(position)
            notifyItemRemoved(position)
            notifyDataSetChanged()
        }
        if(todoList.size == 0){
            todoList.clear()
        }

}

,

这是您删除项目的代码:

val id = MyDBHelper(this).readAllData()
val myList = LevelModelClass(id[position].id,"")

MyDBHelper(this).deleteLabel(myList)
            
LevelAdapter(getItemList(),this).deleteItem(position)

recyclerViewSetUp()

我假设以 MyDBHelper(this).deleteLabel(myList) 结尾的部分是从您的数据库中删除项目的部分,您说该项目有效。

这部分:

LevelAdapter(getItemList(),this).deleteItem(position)

不会影响您的 RecyclerView 中的适配器 - 它正在创建一个 适配器并从 那个 中删除项目(这会导致 getItemList() 中的崩溃{1}} 从数据库中删除最后一个项目后返回一个空列表)。您的 RecyclerView 不受影响。

但是当您调用 recyclerViewSetUp() 时,您会从数据库中的当前项目集创建另一个新适配器,并显示那个。但是当您的项目列表为空时,if(getItemList().size > 0) 失败并且您没有更改适配器,因此它仍然显示旧的,其中包含最后一个项目。这就是为什么您永远不会看到最后一个被删除的原因。


您需要创建一个适配器并在某处保存对它的引用,然后在其上调用 deleteItem

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。