【发布时间】: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