Java recyclerview的适配器中出现空指针异常
我一直在尝试为我的活动实现一个recyclerview,但我一直得到NullPointerException。这是我第一次做回收视图,所以如果我做错了什么,就告诉我。我将向您展示我所有的代码,然后告诉您错误在哪里 我的主xml布局(称为activity_main.xml) 最后是我的适配器Java recyclerview的适配器中出现空指针异常,java,android,android-adapter,android-recyclerview,Java,Android,Android Adapter,Android Recyclerview,我一直在尝试为我的活动实现一个recyclerview,但我一直得到NullPointerException。这是我第一次做回收视图,所以如果我做错了什么,就告诉我。我将向您展示我所有的代码,然后告诉您错误在哪里 我的主xml布局(称为activity_main.xml) 最后是我的适配器 package maxbleggi.afstudentplanner; import android.support.v7.widget.CardView; import android.support.v
package maxbleggi.afstudentplanner;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
public class MainRecyclerAdapter extends RecyclerView.Adapter<MainRecyclerAdapter.ViewHolder>
{
private List<ClassroomClass> classrooms;
public static class ViewHolder extends RecyclerView.ViewHolder
{
// hold data items
public View view;
ViewHolder(View itemView)
{
super(itemView);
view = itemView;
}
}
public MainRecyclerAdapter(List<ClassroomClass> classrooms)
{
this.classrooms = classrooms;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
// create a new view
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.main_recycler_view_row, viewGroup, false);
// set the view's parameters
ViewHolder pvh = new ViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position)
{
// get elements from view
TextView title = (TextView) viewHolder.view.findViewById(R.id.period_title);
TextView subtitle = (TextView) viewHolder.view.findViewById(R.id.period_subtitle);
// retrieve data from data field and put in view
title.setText(classrooms.get(position).getClassName());
subtitle.setText(classrooms.get(position).classPeriod);
}
@Override
public int getItemCount()
{
return classrooms.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
super.onAttachedToRecyclerView(recyclerView);
}
}
任何帮助或评论都是非常感谢的,感谢并为所有代码感到抱歉。我只是想确定我是彻底的。你打电话给我
initClassData();
调用构造函数后:
RecyclerView.Adapter mainAdapter= new MainRecyclerAdapter(classrooms);;
这就是NullPoimter的原因。该对象仍然为空,因此当您在其上调用size()时,将获得nullPoint
只需替换那些to行的顺序。在创建构造函数之前,必须初始化数据,所以只需调用
initClassData();
在适配器构造函数之前
顺便说一句,您应该在viewholder构造函数中执行此代码
// get elements from view
TextView title = (TextView) viewHolder.view.findViewById(R.id.period_title);
TextView subtitle = (TextView) viewHolder.view.findViewById(R.id.period_subtitle);
然后像这样使用它
holder.title.setText
holder.subtitle.setText
只需在创建适配器之前放置initClassData(),即可完成订单翻转,谢谢!这帮我省了好几天的工作想弄明白为什么?我只是好奇。不这样做也行,但你给我展示的方法在性能或其他方面更好。是的,它会起作用,但现在你的取景器几乎什么都没做。它只是在生命周期中将视图从一个方法传递到另一个方法。您不必将完整的容器传递给另一个方法,只需要两个视图。您可以在recyclerview中看到使用它的正确方法,这是不允许的(据我所知),但在listview中,例如,您可以通过在视图的标记中保存当前viewholder来避免在每次getview方法调用中创建viewholder,并在convertview不为null时检索它。
@Override
public int getItemCount()
{
return classrooms.size();
}
initClassData();
RecyclerView.Adapter mainAdapter= new MainRecyclerAdapter(classrooms);;
initClassData();
// get elements from view
TextView title = (TextView) viewHolder.view.findViewById(R.id.period_title);
TextView subtitle = (TextView) viewHolder.view.findViewById(R.id.period_subtitle);