获取空对象错误以在 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
.
中出现空指针异常
我建议检查视图类型并为您的用例实施它们。
我正在尝试为我的 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
.
我建议检查视图类型并为您的用例实施它们。