Jae*_*ger 5 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}
Run Code Online (Sandbox Code Playgroud)
我正在使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
两个片段正在切换它们的布局,当我按下第一个片段时,它加载没有任何问题,当我按下第二个片段时,它加载不同的布局和 FC 本身。
两个片段使用相同的 ViewHolder 代码,但在不同的类中。
就我而言,我在操作列表项(更改其位置)时遇到此错误,但犯了一个错误。我尝试创建一个项目的副本并将其添加到顶部:
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.
Run Code Online (Sandbox Code Playgroud)
我想删除第 7 个项目而不是具有给定的项目id。所以,我没有删除任何内容(removeItem在我的代码中也是如此)。然后我添加了一个具有相同内容的新项目id。现在列表包含两个相等的项目并抛出错误。因此,更正错误以拥有唯一的ids。
如果你不知道 equal ids 出现在哪里,你可以这样做。
设置adapter.setHasStableIds(false)并在其之后分配一个适配器RecyclerView:
with(view.recycler_view) {
layoutManager = this@YourFragment.layoutManager
adapter = this@YourFragment.adapter
setHasFixedSize(true)
}
Run Code Online (Sandbox Code Playgroud)
setHasStableIds(false)如果在之后设置RecyclerView,则会出现错误。
这两个ViewHolder可以属于同一类,不能不同。