1

我正在我的应用程序中实现 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());

            }

        };

它显示以下异常: 在此处输入图像描述

如何使用 FirebaseRecyclerAdapter 获取快照值?

4

3 回答 3

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 为您的每个属于您的孩子“用户”的用户提供对象。您可以通过方法访问 Push id 。getKey()

于 2016-07-01T12:04:38.140 回答
3

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

FirebaseRecyclerViewAdapter中所述modelClass

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

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


编辑

根据评论,我建议让您自己的 modelClass 对象具有 aDataSnapshot作为参数。有关我所说的简单示例,请参阅下文。

public class ModelClass {

        String sampleString;

        ModelClass() {
        }

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

    }

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

由于这种担忧实际上与发布的担忧不同。如果它不起作用,我建议发布一个不同的。快乐编码。干杯!

于 2016-07-01T12:03:35.010 回答
3

firebaser(和 FirebaseUI 适配器的作者)在这里

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

但是,如果您打算使用 a DataSnapshot,则可以覆盖FirebaseRecyclerAdapter.parseSnapshot以处理“转换”:

@Override
protected ChatMessage parseSnapshot(DataSnapshot snapshot) {
    return snapshot;
}
于 2016-07-01T14:48:12.867 回答