我试图为我的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
对于一个布局它工作正常,但在我添加条件以更改布局文件后,我收到错误。
答案 0 :(得分:0)
我不确定您是否可以依赖这样一个事实,即您在onCreateViewHolder
中创建的持有者将对onBindViewHolder
中的相同位置保持相同的视图,因为回收者视图的所有目的都是回收意见。基本上,您可能会收到以前的视图持有者,这些视图持有者已关闭屏幕,您必须回收它们。清理状态并放入新状态。你可能会很幸运,他们包含你想要的观点,但你可能不会。如果您有2个或更多不同的视图,通常方法是使用视图类型 - 请参阅此answer。
在任何情况下,我们假设您可以确定持有人将拥有您期望的视图。假设您的回收者视图有1个项目。此表达式this.counter % 2 == 0
的计算结果为true
,您可以为“灰色”视图创建一个持有者。然后,您将增加counter
- this.counter ++;
的值。 onBindViewHolder
被调用并且评估相同的条件,但现在证明counter
是奇数,并且您正在尝试访问实际上从未膨胀的“蓝色”视图的子视图。这会在holder.textViewBlue.setText
中导致空指针异常。
我建议查看视图类型并为您的用例实现它们。