我正在我的应用程序中实现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获取快照值?
答案 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;
}