我的应用中出现以下错误:
java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
ViewHolder 1:ViewHolder{c7b44d1 position=5 id=3, oldPos=-1, pLpos:-1 not recyclable(1)}
View Holder 2:ViewHolder{67232f6 position=3 id=3, oldPos=-1, pLpos:-1}
我正在使用Mike @github的MaterialDrawer,这是我的观察者样本:
public class FavoritesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView Title;
ImageView Pic;
public FavoritesViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
Title = (TextView) itemView.findViewById(R.id.textViewHighlight);
Pic = (ImageView) itemView.findViewById(R.id.imageViewHighlight);
}
}
两个片段正在切换它们的布局,当我按下第一个时,它加载没有任何问题,当我按下第二个片段时,它加载不同的布局和FC本身。
两个碎片都使用相同的ViewHolder代码但在不同的类中。
答案 0 :(得分:1)
就我而言,操纵列表项(更改其位置)时遇到此错误,但出错了。我试图创建一个项目的副本并将其添加到顶部:
val oldItem = adapter.getItem(id)
val newItem = oldItem.copy(text = "item updated")
adapter.removeItem(7) // Removed nothing.
adapter.addItem(0, newItem) // Added the item with the same id.
我想删除第7个项目,而不是具有给定id
的项目。因此,我没有删除任何内容(removeItem
在我的代码中如此工作)。然后,我添加了一个具有相同id
的新项。现在,列表包含两个相等的项,并引发错误。因此,请更正错误以使其具有唯一的id
。
如果您不知道id
出现在哪里,您可以这样做。
设置adapter.setHasStableIds(false)
,然后分配RecyclerView
的适配器:
with(view.recycler_view) {
layoutManager = this@YourFragment.layoutManager
adapter = this@YourFragment.adapter
setHasFixedSize(true)
}
如果在setHasStableIds(false)
之后设置RecyclerView
,则会得到error。
这两个ViewHolder
可以属于同一类,而不能不同。