Java recyclerview的适配器中出现空指针异常

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

我一直在尝试为我的活动实现一个recyclerview,但我一直得到NullPointerException。这是我第一次做回收视图,所以如果我做错了什么,就告诉我。我将向您展示我所有的代码,然后告诉您错误在哪里

我的主xml布局(称为activity_main.xml)

最后是我的适配器

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);