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

时间:2018-06-03 19:13:15

标签: android android-recyclerview recyclerview-layout

我试图为我的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

对于一个布局它工作正常,但在我添加条件以更改布局文件后,我收到错误。

1 个答案:

答案 0 :(得分:0)

我不确定您是否可以依赖这样一个事实,即您在onCreateViewHolder中创建的持有者将对onBindViewHolder中的相同位置保持相同的视图,因为回收者视图的所有目的都是回收意见。基本上,您可能会收到以前的视图持有者,这些视图持有者已关闭屏幕,您必须回收它们。清理状态并放入新状态。你可能会很幸运,他们包含你想要的观点,但你可能不会。如果您有2个或更多不同的视图,通常方法是使用视图类型 - 请参阅此answer

在任何情况下,我们假设您可以确定持有人将拥有您期望的视图。假设您的回收者视图有1个项目。此表达式this.counter % 2 == 0的计算结果为true,您可以为“灰色”视图创建一个持有者。然后,您将增加counter - this.counter ++;的值。 onBindViewHolder被调用并且评估相同的条件,但现在证明counter是奇数,并且您正在尝试访问实际上从未膨胀的“蓝色”视图的子视图。这会在holder.textViewBlue.setText中导致空指针异常。

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