Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 从my recyclerView中删除最后一项不会';不行?_Kotlin_Android Recyclerview_Adapter - Fatal编程技术网

Kotlin 从my recyclerView中删除最后一项不会';不行?

Kotlin 从my recyclerView中删除最后一项不会';不行?,kotlin,android-recyclerview,adapter,Kotlin,Android Recyclerview,Adapter,大家好,我创建了一个recyclerView,在我的recyclerView中,我可以从sqlite数据库和recyclerView本身添加和删除项目,一切正常,但当我尝试删除最后一个项目时,应用程序崩溃,我得到Java.Lang.IndexOutOfBoundsException索引:0大小:0。但最后一项已成功从我的sqlite数据库中删除 这是我的回收服务适配器: inner class ViewHolder(val binding: LevelLayoutBinding) :

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

这是我的回收服务适配器


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

在我的主要活动中


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


提前感谢:)

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

RecycleServiceAdapter中,将deleteItem函数更改为:

fun deleteItem(position: Int) {

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

}

main活动中单击tvDelete时执行以下代码:

tvDelete.setOnClickListener {

            val id = MyDBHelper(this).readAllData()
            if( id.isEmpty() ) return@setOnClickListener
            val myList = LevelModelClass(id[position].id, "")
            MyDBHelper(this).deleteLev(myList)
            LevelAdapter(getItemList(), this).deleteItem(position)
            if( id.size == 1 ) binding.rvLevel.visibility = View.GONE
            recyclerViewSetUp()
            customDialog.dismiss()

}


这是删除项目的代码:

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(位置)

不会影响
RecyclerView
中的适配器-它正在创建一个新的适配器并从适配器中删除该项(当
getItemList()
从数据库中删除最后一项后返回空列表时,导致崩溃)。您的
RecyclerView
不受影响

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



您需要创建一个适配器,并在某个地方保存对它的引用,然后在该适配器上调用
deleteeItem

发布堆栈跟踪,朋友!这样人们就能知道是什么导致了这次事故。另外,您的
deleteItem
函数可能应该检查
位置
是否有要删除的项目,因为
removeAt
将抛出一个与您看到的异常类似的异常(但如果没有堆栈跟踪,则无法确定)@cactustictacs对于bcz很抱歉,但是我发布了我确定的是我的问题的原因,我确定问题的原因在我的recyclerview适配器中,如果您发布stacktrace(显示
Java.Lang.IndexOutOfBoundsException索引的位:0 size:0
以及之后的所有行)人们将能够准确地告诉你问题出在哪里!否则我们只是guessing@cactustictacs好的,给我一个sec@cactustictacs好的,我添加了stacktrace,正如我所说的,问题出在我的适配器上。是的,我已经找到了解决方案。非常感谢你,没有你的解释我找不到
val id = MyDBHelper(this).readAllData()
val myList = LevelModelClass(id[position].id, "")

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

recyclerViewSetUp()