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

Posted

技术标签:

【中文标题】将数据从 Firebase 提取到 RecyclerView 时出错。致命异常:...没有定义无参数构造函数【英文标题】:Error in fetching data from Firebase to RecyclerView. FATAL EXCEPTION: ... does not define a no-argument constructor 【发布时间】:2022-01-16 20:12:37 【问题描述】:

我已经设计了活动,以便它从 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?

如何将 firebase 函数提取到 Swift 中的对象?

如何在不实际创建数据库的情况下将在线可用数据库 API 中的数据提取到 firebase 数据库中? [关闭]