gpt4 book ai didi

android - 从同一类扩展的 RecyclerView ViewHolder 具有不同的 View 类型(两个不同的 ViewHolder 具有相同的稳定 ID)

转载 作者:行者123 更新时间:2023-11-29 01:16:30 24 4
gpt4 key购买 nike

在我的 RecyclerView 适配器中只有一个 ViewHolder 类:

public static class PlayerItemViewHolder extends RecyclerView.ViewHolder {
public ImageView news_image;
public TextView news_title;
public PlayerItemViewHolder(View view) {
super(view);
news_image = (ImageView) view.findViewById(R.id.news_image);
news_title = (TextView) view.findViewById(R.id.news_title);
}
}

@Override
public PlayerAdapter.PlayerItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View item_view = layoutInflater.inflate(R.layout.player_news_item, parent, false);
return new PlayerItemViewHolder(item_view);
}
@Override
public void onBindViewHolder(final PlayerAdapter.PlayerItemViewHolder viewHolder, Cursor cursor) {
Log.d("id", viewHolder.getItemId()+"");
Log.d("view_type", viewHolder.getItemViewType()+"");
Log.d("class", viewHolder.getClass().toString());
}

当我运行这段代码时:

08-27 15:57:03.414 19971-19971/? D/id: 0
08-27 15:57:03.414 19971-19971/? D/view_type: 1
08-27 15:57:03.414 19971-19971/? D/class: class io.github.nekotachi.easynews.ui.adapter.PlayerAdapter$PlayerItemViewHolder
08-27 15:57:03.421 19971-19971/? D/id: 0
08-27 15:57:03.421 19971-19971/? D/view_type: 2
08-27 15:57:03.421 19971-19971/? D/class: class io.github.nekotachi.easynews.ui.adapter.PlayerAdapter$PlayerItemViewHolder

最后,它导致错误:

java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.

在这种情况下,我认为 View 类型应该相同,因为它们具有相同的类。而且,id 也应该不同。

最佳答案

我猜你在 RecyclerView 中从 getItemViewType 函数为你的 View 传递了不同的 ViewType

如果您从 getItemViewType 返回不同的 ViewType 那么您需要在 onBindViewHolder 中以不同的方式处理 ViewType > 以及不同的 ViewHolder 类型。

例如,您有两个不同的 ViewType。这两个可以有相同的布局。但是您需要像这样为它们中的每一个指定一个 ViewHolder

// For view_type = 1
private class FirstItemViewHolder extends ViewHolder {
public FirstItemViewHolder(View itemView) {
super(itemView);
}
}

// For view_type = 2
private class SecondItemViewHolder extends ViewHolder {
public SecondItemViewHolder(View itemView) {
super(itemView);
}
}

现在从您的 getItemViewType 方法中您将像往常一样返回 ViewType

@Override
public int getItemViewType(int position) {
if(returnFirstViewType()){
return VIEW_TYPE_1;
} else {
return VIEW_TYPE_2;
}

return super.getItemViewType(position);
}

现在,当您在 onBindViewHolder 方法中绑定(bind)每个 View 持有者时,您需要先检查 ViewType,然后您需要像这样执行其他操作。

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

try {
if (holder instanceof FirstItemViewHolder) {
FirstItemViewHolder vh = (FirstItemViewHolder) holder;
// Code for view_type = 1 goes here

} else {
// Code for view_type = 2 goes here
}
} catch (Exception e) {
e.printStackTrace();
}
}

关于android - 从同一类扩展的 RecyclerView ViewHolder 具有不同的 View 类型(两个不同的 ViewHolder 具有相同的稳定 ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39187827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com