获取空对象错误以在 recyclerView 中使用多个布局

getting null object error to use multiple layout in recyclerView

我正在尝试为我的 RecyclerView 项目使用两种布局,我为此目的编写了这段代码。它应该改变奇数和偶数基数的布局

public class WordListAdaptor extends RecyclerView.Adapter<WordListAdaptor.ViewHolder>{

private Context context;
private List<Word> words;
public int counter = 1;

public WordListAdaptor(Context context, List<Word> words){

    this.context = context;
    this.words = words;

}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    if ( this.counter % 2 == 0) {
        view = LayoutInflater.from(this.context).inflate(R.layout.search_listview_gray, parent, false);
    } else{
    view = LayoutInflater.from(this.context).inflate(R.layout.search_listview_blue,parent,false);}

    this.counter ++;

    return new ViewHolder(view);
}

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

    if ( this.counter % 2 == 0)

        holder.textViewGray.setText(words.get(position).getOrginalWord() + " Pos : " + position);

    else
        holder.textViewBlue.setText(words.get(position).getOrginalWord() + " Pos : " + position);


}

@Override
public int getItemCount() {
    return words.size();
}

class ViewHolder extends RecyclerView.ViewHolder{

    private TextView textViewBlue;
    private TextView textViewGray;
    private ImageButton blueItemStar;
    private ImageButton grayItemStar;

    public ViewHolder(View itemView) {
        super(itemView);
        textViewBlue = itemView.findViewById(R.id.listView_item_textView_blue);
        textViewGray = itemView.findViewById(R.id.listView_item_textView_gray);
        blueItemStar = itemView.findViewById(R.id.blue_item_star);
        grayItemStar = itemView.findViewById(R.id.gray_item_star);
    }
}
}

但是对于这段代码,我得到了这个错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

对于一个布局,它运行良好,但在我添加条件以更改布局文件后,出现错误。

我不确定您是否可以相信您在 onCreateViewHolder 中创建的持有人将在 onBindViewHolder 中对相同职位持有相同观点毕竟是回收商的目的视图是回收视图。基本上,您可能会收到从屏幕上消失的以前的视图持有者,您必须回收它们。清洁状态并放上新的。您可能会很幸运,因为它们包含您想要的视图,但您可能不会。当您有 2 个或更多不同的视图时,通常的方法是使用视图类型 - 请参阅此 answer.

无论如何,我们假设您可以确定持有人会有您期望的观点。假设您的回收站视图有 1 个项目。此表达式 this.counter % 2 == 0 的计算结果为 true 并且您为 "gray" 视图创建了一个容器。然后,您将增加 counter - this.counter ++; 的值。 onBindViewHolder 被调用并评估了相同的条件,但现在发现 counter 是奇怪的并且您正在尝试访问实际上从未膨胀的 "blue" 视图的子视图。这会导致 holder.textViewBlue.setText.

中出现空指针异常

我建议检查视图类型并为您的用例实施它们。