【问题标题】:Deleting the last item from my recyclerView doesn't work?从我的 recyclerView 中删除最后一项不起作用?
【发布时间】:2021-04-21 17:26:42
【问题描述】:

大家好,我创建了一个 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)

提前致谢:)

【问题讨论】:

  • 发布堆栈跟踪,朋友!因此,人们可以看到导致崩溃的原因。此外,您的 deleteItem 函数可能应该检查 position 处是否有要删除的项目,因为 removeAt 会抛出您所看到的异常(虽然没有堆栈跟踪,但无法确定)
  • @cactustictacs 对那个 bcz 感到抱歉,但我发布了我确定是我的问题的原因,我确定问题出在我的 recyclerview 适配器中
  • 如果您发布堆栈跟踪(上面写着Java.Lang.IndexOutOfBoundsException index:0 size:0 的位以及之后的所有行),人们将能够准确地告诉您问题出在哪里!否则我们只是猜测
  • @cactustictacs 好的,给我一点时间
  • @cactustictac 好的,我添加了堆栈跟踪,似乎正如我所说,问题出在我的适配器中

标签: kotlin android-recyclerview adapter


【解决方案1】:

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

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

fun deleteItem(position: Int) {

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

}

当点击 tvDelete 时,在 MainActivity 中执行此代码:

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

}

【讨论】:

    【解决方案2】:

    这是您删除项目的代码:

    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 中的适配器 - 它正在创建一个 适配器并从 that 中删除项目(这会导致 getItemList() 时崩溃从数据库中删除最后一项后返回一个空列表)。您的RecyclerView 不受影响。

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


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

    【讨论】:

    • 是的,你说得对,我已经找到了解决方案,非常感谢你,如果没有你的解释,我找不到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多