簡體   English   中英

將數據從 Firebase 提取到 RecyclerView 時出錯。 致命異常:...沒有定義無參數構造函數

[英]Error in fetching data from Firebase to RecyclerView. FATAL EXCEPTION: ... does not define a no-argument constructor

我已經設計了活動,以便它從 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 架構是

圖片

我在做什么錯誤請幫助我找出錯誤? 謝謝!

您收到以下錯誤:

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

因為您的RvClass類沒有定義no-argument constructor

JavaBeans 需要一個無參數的構造函數

在 Java 中,當一個類根本沒有構造函數時,編譯器會自動添加一個默認no-argument constructor 在類中定義任何構造函數的那一刻,默認的無參數構造函數就會消失。

在您的代碼中,您的RvClass類定義了一個包含三個參數的構造函數:

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

只要這個構造函數存在並且你沒有定義一個無參數的構造函數,那個類就不會有一個。

要解決此問題,您可以從類中刪除該構造函數,或者手動添加一個無參數構造函數,如下所示:

public RvClass() {}

當 Firebase Realtime 數據庫 SDK 反序列化來自數據庫的對象時,它要求所有正在使用的對象都具有此構造函數,以便可以使用它來實例化對象。 對象中的字段是通過使用公共 setter 方法或直接訪問公共成員來設置的。

如果您的 RvClass 類沒有公共的無參數構造函數,則 SDK 並不真正知道如何創建它的實例。 所以必須擁有它。

另請注意,setter 和 getter 不是必需的。 Setter 始終是可選的,因為如果 JSON 屬性沒有 setter,Firebase 客戶端會將值直接設置到字段中。 也不需要帶參數的構造函數。 兩者都是慣用的,並且有很好的情況下沒有它們的類。 如果您公開這些字段,則 getter 也是可選的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM