如何解决从我的 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 举报,一经查实,本站将立刻删除。