Java 回收器视图中的多个视图类型设置不正确

Java 回收器视图中的多个视图类型设置不正确,java,android,kotlin,android-recyclerview,Java,Android,Kotlin,Android Recyclerview,我有两个数组列表,我想设置适配器,使它看起来像屏幕一下面。但当我设置适配器时,我得到的视图就像第二个屏幕。这是我的适配器代码: public class ItemArrayAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { final int VIEW_TYPE_MESSAGE = 0; final int VIEW_TYPE_IMAGE = 1; private static final String TA

我有两个数组列表,我想设置适配器,使它看起来像屏幕一下面。但当我设置适配器时,我得到的视图就像第二个屏幕。这是我的适配器代码:

public class ItemArrayAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
final int VIEW_TYPE_MESSAGE = 0;
final int VIEW_TYPE_IMAGE = 1;
private static final String TAG = "ItemArrayAdapter";
Context context;
ArrayList<BeforLoginDao.Article> mArticleList;
ArrayList<BeforLoginDao.Quiz> mQuizList;
int i=0;

public ItemArrayAdapter(Context context,ArrayList<BeforLoginDao.Quiz> mQuizList, ArrayList<BeforLoginDao.Article> mArticleList ){
    this.context = context;
    this.mArticleList = mArticleList;
    this.mQuizList = mQuizList;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View itemView;
    if(viewType == VIEW_TYPE_MESSAGE){
        itemView= LayoutInflater.from(parent.getContext()).inflate(R.layout.article_layout,parent,false);
        return new ArticleViewHolder(itemView);
    }
    else if(viewType == VIEW_TYPE_IMAGE){
        itemView= LayoutInflater.from(parent.getContext()).inflate(R.layout.quiz,parent,false);
        return new QuizViewHolder(itemView);
    }

    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position){
    Log.e(TAG, "onBindViewHolder: " +position);
    if(viewHolder instanceof ArticleViewHolder){
        ((ArticleViewHolder) viewHolder).populate(mArticleList.get(position));
    }
    else if(viewHolder instanceof QuizViewHolder){
        ((QuizViewHolder) viewHolder).populate(mQuizList.get(position - mArticleList.size()));
    }
}

@Override
public int getItemCount(){
    return mArticleList.size() + mQuizList.size();
}

@Override
public int getItemViewType(int position){
    Log.e(TAG, "getItemViewType: " +position );
    if(position < mArticleList.size()){
        return VIEW_TYPE_MESSAGE;
    }

    if(position - mArticleList.size() < mQuizList.size()){
        return VIEW_TYPE_IMAGE;
    }

    return -1;
}

public class ArticleViewHolder extends RecyclerView.ViewHolder {
    public TextView mTitle, mTag1, mTag2  ;
    ImageView mImageView;
    public ArticleViewHolder(View itemView) {
        super(itemView);
        mTitle =  itemView.findViewById(R.id.tv_article_title);
        mTag1 = itemView.findViewById(R.id.tv_article_tag1);
        mTag2 = itemView.findViewById(R.id.tv_article_tag2);
        mImageView=itemView.findViewById(R.id.img_article);
    }

    public void populate(BeforLoginDao.Article chatWrapper){
       mTitle.setText(chatWrapper.articleTitle.toString());
       mTag1.setText(chatWrapper.subtag1);
       mTag2.setText(chatWrapper.subtag2);

    }
}

public class QuizViewHolder extends RecyclerView.ViewHolder {
    public TextView tvQuizTitle, tvQuizTag1, tvQuizTag2 ;
    public QuizViewHolder(View itemView) {
        super(itemView);

        tvQuizTitle =  itemView.findViewById(R.id.tv_quiz_title);
        tvQuizTag1 =itemView.findViewById(R.id.tv_quiz_tag1);
        tvQuizTag2=itemView.findViewWithTag(R.id.tv_quiz_tag2);



    }

    public void populate(BeforLoginDao.Quiz imageDataWrapper){
        Log.e(TAG, "ViewHolderTwo: " +imageDataWrapper.toString()  );
      tvQuizTitle.setText(imageDataWrapper.quizTitle);
      tvQuizTag1.setText(imageDataWrapper.quiz_subtag1);
    }
}
公共类ItemArrayAdapter扩展了RecyclerView.Adapter{
最终int视图\类型\消息=0;
最终int视图类型图像=1;
私有静态最终字符串标记=“ItemArrayAdapter”;
语境;
阵列列表;
ArrayList mQuizList;
int i=0;
公共项ArrayAdapter(上下文上下文、ArrayList mQuizList、ArrayList mArticleList){
this.context=上下文;
this.mArticleList=mArticleList;
this.mQuizList=mQuizList;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
查看项目视图;
如果(视图类型==视图类型消息){
itemView=LayoutInflater.from(parent.getContext()).flate(R.layout.article\u布局,parent,false);
返回新的ArticleViewHolder(itemView);
}
else if(viewType==视图类型图像){
itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.quick,parent,false);
返回新的QuizViewHolder(itemView);
}
返回null;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder ViewHolder,int位置){
Log.e(标签“onBindViewHolder:”+位置);
if(viewHolder实例of Article viewHolder){
((ArticleViewHolder)viewHolder).填充(mArticleList.get(position));
}
else if(QuizViewHolder的视图持有者实例){
((QuizViewHolder)viewHolder).填充(mQuizList.get(position-mArticleList.size());
}
}
@凌驾
public int getItemCount(){
返回mArticleList.size()+mQuizList.size();
}
@凌驾
public int getItemViewType(int位置){
Log.e(标记“getItemViewType:+位置);
如果(位置
}

为了解决这个错误,我还检查了许多解决方案。 参考:

下面是第一屏和第二屏。我需要的第一屏,我得到的第二屏


选中此项显示布局和设置回收服务的位置从屏幕1,看起来您希望文章视图位于奇数位置(1,3,5…),测验视图位于偶数位置(2,4,6…)。我说得对吗?然后,在getItemViewType上,执行位置%2以设置项目视图,否则view@SolaimanHossain是的,你明白我的意思了。现在我在6个位置向底部滚动时得到arrayindexout-boud异常。((QuizViewHolder)viewHolder)。填充(mQuizList.get(position-mArticleList.size());可能应该是这样((QuizViewHolder)viewHolder)。填充(mQuizList.get(position));