>问题
我已经使用外部库为回收器视图实现了多选行为。现在,为了从回收器视图中删除项目,我实现了两个 for 循环。第一个 for 循环从 SQLite 中删除的项目,第二个 for 循环从适配器中删除相应的视图。但是,从适配器中删除视图时会出现此问题。
for (i in selectedCardItems!!.indices) //selectedCardItems stores selected card position.
{
val index = selectedCardItems!![i]
val noteRowID = listItems!![index] //list items contains references to items in SQLite and is fed to recyclerview.setadapter = myAdapter(context,listitems)
dbHandler!!.deleteNote(noteRowID.noteID!!)
}
for(i in selectedCardItems!!.indices)
{
val index = selectedCardItems!![i]
listItems!!.removeAt(i) //problem starts here, due to mismatched indexes.
adapter!!.notifyItemRemoved(i)
}
if(dbHandler!!.trashedNotesCount() == 0)
{
trashedRecyclerView!!.visibility = View.GONE
emptyTrashImg!!.visibility = View.VISIBLE
emptyTrashMsg!!.visibility = View.VISIBLE
}
selectedCardItems!!.clear() //once all operation is done,remove card positions from this ArrayList.
}
listitem 和 selectedCardPosition 都是 ArrayList 类型。我知道,一旦从索引中删除了 ArrayList 中的项目,那么较高索引的项目索引将自动移动到较低的索引。解决此问题的有效方法是什么?
我尝试过的:一个糟糕的修复是基本上删除第二个删除视图的 for 循环并将其替换为 adapter.notifyDataSetChanged((,这也删除了删除动画。
如果我正确理解您的问题,则会出现问题,因为从列表中删除会破坏初始索引。如果是这种情况,您必须从较高的索引开始删除,然后向下删除。因此,在循环之前按降序对列表进行排序:
selectedCardItems!!.sortDescending()