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));