Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从同一类扩展的RecyclerView ViewHolder具有不同的视图类型(两个不同的ViewHolder具有相同的稳定ID)_Android_Android Recyclerview - Fatal编程技术网

Android 从同一类扩展的RecyclerView ViewHolder具有不同的视图类型(两个不同的ViewHolder具有相同的稳定ID)

Android 从同一类扩展的RecyclerView ViewHolder具有不同的视图类型(两个不同的ViewHolder具有相同的稳定ID),android,android-recyclerview,Android,Android Recyclerview,myRecyclerView适配器中只有一个ViewHolder类: public static class PlayerItemViewHolder extends RecyclerView.ViewHolder { public ImageView news_image; public TextView news_title; public PlayerItemViewHolder(View view) { super(view); n

my
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.

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

我猜您在
RecyclerView
函数中为视图传递了不同的
ViewType

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

例如,您有两个不同的
视图类型
。这两个可以有相同的布局。但是您需要像这样为每个视图指定一个
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);
    }
}
@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();
    }
}
现在,从
getItemViewType
方法返回
ViewType

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

    return super.getItemViewType(position);
}
现在,当您在
onBindViewHolder
方法中绑定每个视图持有者时,您需要首先检查
ViewType
,然后需要执行类似的其他操作

// 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);
    }
}
@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();
    }
}

您可以使用adapter.setHasStableIds(false)来防止错误。但是,如果需要使用id[它们用于防止闪烁效果],请覆盖适配器的getItemId方法并创建自己的唯一id。