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