将数据从 Firebase 提取到 RecyclerView 时出错。致命异常:...没有定义无参数构造函数
Posted
技术标签:
【中文标题】将数据从 Firebase 提取到 RecyclerView 时出错。致命异常:...没有定义无参数构造函数【英文标题】:Error in fetching data from Firebase to RecyclerView. FATAL EXCEPTION: ... does not define a no-argument constructor 【发布时间】:2018-12-04 17:25:15 【问题描述】:我已经设计了活动,以便它从 firebase Db 获取数据并将其显示在回收器视图中,但是当我运行它时会出现以下错误
我的代码是
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 架构是
我做错了什么请帮助我找出错误? 谢谢!
【问题讨论】:
public RvClass() 在 RvClass 中添加这段代码 在 RvClass 中添加 RvClass 的空构造函数,如 public RvClass() 【参考方案1】:您收到以下错误:
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 实时数据库 SDK 反序列化来自数据库的对象时,它要求所有正在使用的对象都必须具有此构造函数,以便可以使用它来实例化对象。对象中的字段通过使用公共 setter 方法或直接访问公共成员来设置。
如果您的 RvClass 类没有公共的无参数构造函数,SDK 并不真正知道如何创建它的实例。所以必须要有。
另外请注意,setter 和 getter 不是必需的。 Setter 始终是可选的,因为如果 JSON 属性没有 setter,Firebase 客户端会将值直接设置到字段中。也不需要带参数的构造函数。两者都是惯用的,并且有很好的情况下没有它们的类。如果您将字段设为公开,则 getter 也是可选的。
【讨论】:
对于遇到此错误的 Kotlin 用户,只需为您的数据类字段提供默认值或 null。从这个答案中找到了这个解决方案 - [链接到答案] (***.com/a/57278584/8442557)以上是关于将数据从 Firebase 提取到 RecyclerView 时出错。致命异常:...没有定义无参数构造函数的主要内容,如果未能解决你的问题,请参考以下文章
从 Firebase 提取的数据中没有出现 UITableViewCells
如何将firebase快照值从一个函数提取到另一个函数变量?
无法显示从Firebase提取的数据到reactjs Webapp中
如何将 Firebase 数据提取到数组中以进行 recyclerview?