从Firebase到RecyclerView提取数据时出错。致命异常:...未定义无参数构造函数

时间:2018-06-26 05:10:54

标签: android firebase firebase-realtime-database

我对活动进行了设计,使其能够从Firebase Db中获取数据并将其显示在回收站视图中,但是当我运行它时,会发生错误

image

我的代码是

package com.example.android.indiandigitalschool;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class ReceiveNews1 extends AppCompatActivity {
private RecyclerView rv;
private ArrayList<RvClass> list = new ArrayList<>() ;
private DatabaseReference demo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_receive_news1);
    rv = findViewById(R.id.rv);
    rv.setHasFixedSize(true);
    rv.setLayoutManager(new LinearLayoutManager(this));

    demo= FirebaseDatabase.getInstance().getReference().child("IDS").child("News");
    demo.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
            RvClass rvClass = snapshot.getValue(RvClass.class);//error occurs here
              list.add(rvClass);

            }
            CustomAdapter adapter = new CustomAdapter(ReceiveNews1.this,list);
            rv.setAdapter(adapter);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}
}

我用于处理数据的模态类(RvClass)代码是

package com.example.android.indiandigitalschool;

public class RvClass {
private String title;
private String message;
private String time;

public RvClass(String title, String message, String time) {
    this.title = title;
    this.message = message;
    this.time = time;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}
}

我的Firebase架构是

image

我在做什么错误,请帮助我找出错误? 谢谢!

1 个答案:

答案 0 :(得分:0)

您遇到以下错误:

FATAL EXCEPTION: ... does not define a no-argument constructor

因为您的RvClass类未定义no-argument constructor

要出现的JavaBeans require a no-argument constructor

在Java中,当一个类根本没有构造函数时,编译器会自动添加一个默认的no-argument constructor。在类中定义任何构造函数后,默认的无参数构造函数就会消失。

在您的代码中,您的RvClass类定义了一个包含三个参数的构造函数:

public RvClass(String title, String message, String time) {}

只要此构造函数存在并且您没有定义无参数构造函数,该类就不会有一个。

要解决此问题,您可以从类中删除该构造函数,或者手动添加无参构造函数,如下所示:

public RvClass() {}

当Firebase Realtime数据库SDK反序列化来自数据库的对象时,它要求所有正在使用的对象都具有此构造函数,以便它可以实例化该对象。通过使用公共设置方法或直接访问公共成员来设置对象中的字段。

如果您的RvClass类没有公共的无参数构造函数,则SDK并不真正知道如何创建其实例。因此必须拥有它。

还请注意,不需要使用setter和getter。设置器始终是可选的,因为如果没有JSON属性的设置器,Firebase客户端将直接在字段上设置值。也不需要带参数的构造函数。两者都是惯用的,在没有它们的情况下有很好的案例。如果您将这些字段设为公开,则吸气剂也是可选的。