Android java java.lang.NullPointerException: 解析服务器回收器视图

Android java java.lang.NullPointerException: parse server recycler view

我正在尝试从解析器检索数据到我的适配器,但出现错误:

05-20 04:17:52.955 4266-4266/rabshet.home.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: rabshet.home.myapplication, PID: 4266
java.lang.RuntimeException: Unable to start activity ComponentInfo{rabshet.home.myapplication/rabshet.home.myapplication.RecyclerViewActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.equals(java.lang.Object)' on a null object reference
at rabshet.home.myapplication.RVAdapter.<init>(RVAdapter.java:43)
at rabshet.home.myapplication.RecyclerViewActivity.initializeAdapter(RecyclerViewActivity.java:73)
at rabshet.home.myapplication.RecyclerViewActivity.onCreate(RecyclerViewActivity.java:37)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

与服务器的连接正常。

我的adapter.java

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
public static class PersonViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    TextView personName;
    TextView personAge;
    ParseImageView personPhoto;

    PersonViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        personName = (TextView)itemView.findViewById(R.id.person_name);
        personAge = (TextView)itemView.findViewById(R.id.person_age);
        personPhoto = (ParseImageView)itemView.findViewById(R.id.person_photo);

    }
}


List<Person> persons;

RVAdapter(List<ParseObject> persons){
    this.persons .equals(persons);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    PersonViewHolder pvh = new PersonViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.personName.setText(persons.get(i).name);
    personViewHolder.personAge.setText(persons.get(i).describe);


    //personViewHolder.personPhoto.setParseFile(persons.get(0).photoId);
//personPhoto should be ImageView or your CustomImageView
        Glide.with(personViewHolder.personPhoto.getContext())
                .load(persons.get(0).photoId)
                .fitCenter()
                .into(personViewHolder.personPhoto);
        //personViewHolder.personPhoto.setParseFile(persons.get(2).photoId);

}

@Override
public int getItemCount() {
    return persons.size();
}
}

我的主要activity。 我认为查询 class 名称时出现的错误我确定是真的。

public class RecyclerViewActivity extends Activity {
private List<ParseObject> persons;
private List<ParseFile>image;
private RecyclerView rv;
private int[] img;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    rv=(RecyclerView)findViewById(R.id.rv);

    LinearLayoutManager llm = new LinearLayoutManager(this);
    rv.setLayoutManager(llm);
    rv.setHasFixedSize(true);

    initializeData();
    initializeAdapter();
}

private void initializeData(){
    persons = new ArrayList<>();


    //Query to load String data into the card view/recycler view
    ParseQuery<ParseObject> query = ParseQuery.getQuery("proudect");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> objects, ParseException e) {

            if (e == null) {

                for (int i = 0; i < objects.size(); i++) {

                    persons.add(objects.get(i).getParseObject("pr_name"));
                    persons.add(objects.get(i).getParseObject("describe"));
                    image.add(objects.get(i).getParseFile("pr_image"));

                   // persons.add(new Person(objects.get(i).getString("pr_name"), objects.get(i).getString("describe"), objects.get(i).getParseFile("pr_image"), img[i]));

                }
            } else {
                // something went wrong
            }


            initializeAdapter();
        }
    });

}

private void initializeAdapter(){
    RVAdapter adapter = new RVAdapter(persons);
    rv.setAdapter(adapter);
}
}

Person.java

class Person  {
    String name;
    String describe;
    ParseFile photoId;
Person(String name, String describe, ParseFile image, int i) {
    this.name =name;
    this.describe =describe;
}


}

My app Github.

请帮帮我。

问题出在

List<Person> persons;

RVAdapter(List<ParseObject> persons){
    this.persons .equals(persons);
}

使用这个

List<ParseObject> persons ;    // here `List` is of `ParseObject`

RVAdapter(List<ParseObject> persons){      // here persons `List` is also of `ParseObject`
    this.persons = persons;                // if both `List` are of same type i.e `ParseObject` then we can set data one to another
}
  1. 您打算初始化变量的构造函数导致了异常。

    this.persons .equals(人); 此语句不会为成员变量分配任何值,它只是检查是否相等。在这种情况下,由于 this.persons 仍然是 null 因为它还没有被初始化,你会在相等性检查中得到 NullPointerException

    将其替换为赋值运算符。

    this.persons = persons;
    

    这样就可以了。

  2. 既然你的构造函数的参数是List<ParseObject>,那么成员变量也应该是一样的。请将List<Person> persons;初始化为List<ParseObject> persons;