DataSnapshot缺少没有参数的构造函数

时间:2016-07-01 11:43:21

标签: android firebase firebaseui

我正在我的应用程序中实现Firebase Recyclerview UI。我已经实现了一个recyclerview适配器,它向我显示以下异常。 以下是我的适配器代码:

FirebaseRecyclerAdapter<DataSnapshot, MyHolder> recyclerAdapter = new FirebaseRecyclerAdapter<DataSnapshot, MyHolder>(
                DataSnapshot.class,
                R.layout.row_slots,
                MyHolder.class,
                databaseReference.child("slots").child(uid).child(dayOfWeek).child("time")
        ) {
            @Override
            protected void populateViewHolder(MyHolder viewHolder, DataSnapshot model, int position) {

                System.out.println("Key : "+model.getKey());

            }

        };

显示以下异常: enter image description here

如何使用FirebaseRecyclerAdapter获取快照值?

3 个答案:

答案 0 :(得分:6)

问题是DataSnapShot 缺少无参数构造函数,因此您无法像这样直接使用它。

  

改用其他模型类。

像这样:

创建一个名为FriendlyMessage的模型:

public class FriendlyMessage {

private String text;
private String name;

// Created constructor with no Arguments 
public FriendlyMessage() {
}

public FriendlyMessage(String text, String name) {
    this.text = text;
    this.name = name;       
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}
  

最重要的我们创建的没有参数的构造函数   DataSnapShot

中遗漏了哪些内容

注意:上面的模型类只是一个例子,因为你是firebase的新手。您可以拥有自己的模型类,其中包含您自己的参数类型和所有参数。

将它用于您的Firebase Recyclerview:

FirebaseRecyclerAdapter mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MyHolder>(
                    FriendlyMessage.class,
                    R.layout.row_slots,
                    MyHolder.class,
                    databaseReference.child("slots").child(uid).child(dayOfWeek).child("time")) {

        @Override
        protected void populateViewHolder(MyHolder viewHolder, FriendlyMessage friendlyMessage, int position)
        {

        }
    };

编辑:

  

如何推送数据库上的数据也很重要。做吧   直接使用您的模型类。

例如对于上面的模型FriendlyMessage,请按以下方式推送:

FriendlyMessage friendlyMessage = new FriendlyMessage("message", "Username");
databaseReference.child(MESSAGES_CHILD).push().setValue(friendlyMessage);

此处您的child()与我的实施方式略有不同,只是一个例子。

收听特定的DataSnapShot:

databaseReference.child("users").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                //The PUSH ID OP WANTED

                System.out.println("Push Id ---"+postSnapshot.getKey()); 
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    })
  

解释上面的听众。它会给你DataSnapShot   每个落入您孩子“用户”的用户的对象。 您可以通过getKey()方法访问推送ID。

答案 1 :(得分:3)

在初始化recyclerAdapter时,您将DataSnapshot.class作为modelClass传递,其中DataSnapshot实际上没有构造函数没有我认为导致的参数错误,我认为这会使DataSnapshot无效modelClass

modelClass的{​​{3}}所述:

  

modelClass - Firebase会将某个位置的数据编组到您提供的类的实例中

您应该通过创建满足您需求的对象来定义自己的modelClass。您可以查看FirebaseRecyclerViewAdapter链接上的一个简单示例。干杯!

修改

根据评论,我建议你自己的modelClass对象有一个DataSnapshot作为参数。有关我所说的简单示例,请参阅下文。

public class ModelClass {

        String sampleString;

        ModelClass() {
        }

        ModelClass(DataSnapshot dataSnapshot) {
            // Do what you need from the dataSnapshot here
            sampleString = dataSnapshot.child("").toString();
        }

    }

我想从上面的例子中,你会明白我的意思。 但是,我不确定这是推荐也不确定。我之前没有试过这个,所以我也不确定它是否会起作用。

因为这个问题实际上与发布的不同。我建议发布一个不同的,如果它不起作用。快乐的编码。干杯!

答案 2 :(得分:3)

firebaser(以及FirebaseUI适配器的作者)

已经有很多好的答案。我确实通常建议创建一个代表数据对象的Java类。

但如果您打算使用DataSnapshot,则可以覆盖FirebaseRecyclerAdapter.parseSnapshot来处理&#34;转换&#34;:

@Override
protected ChatMessage parseSnapshot(DataSnapshot snapshot) {
    return snapshot;
}