java.lang.IllegalStateException:两个不同的ViewHolder具有相同的稳定ID

时间:2016-06-06 05:43:47

标签: java android android-fragments

我的应用中出现以下错误:

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代码但在不同的类中。

1 个答案:

答案 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可以属于同一类,而不能不同。