java - 让特定的孩子进入 Firebase RecyclerView
问题描述
构建用户活动,尝试从数据库(名称、已售商品和日期)中检索特定信息,从所有用户类和我的数据库参考中获取此信息,并将其显示在我的应用程序的 Recyclerview 中。
我的数据库
为此https://github.com/firebase/FirebaseUI-Android/尝试了 FirebaseUI-Android
我的应用程序崩溃了!
我的代码:
@Override
protected void onStart() {
super.onStart();
startListening();
}
public void startListening(){
Query query = FirebaseDatabase.getInstance()
.getReference()
.child("Users")
.limitToLast(50);
FirebaseRecyclerOptions<ALL_USERS> options =
new FirebaseRecyclerOptions.Builder<ALL_USERS>()
.setQuery(query, ALL_USERS.class)
.build();
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<ALL_USERS, UsersViewHolder>(options) {
@Override
public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.users_card_layout, parent, false);
return new UsersViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull UsersViewHolder usersViewHolder, int i, @NonNull ALL_USERS all_users) {
usersViewHolder.setName(all_users.getName());
}
};
mUsersList.setAdapter(adapter);
adapter.startListening();
}
public static class UsersViewHolder extends RecyclerView.ViewHolder{
View mView;
public UsersViewHolder(View itemView) {
super(itemView);
mView=itemView;
}
public void setName(String name){
TextView userNameView = mView.findViewById(R.id.Users_Name);
userNameView.setText(name);
}
}
}
所有用户类:
public class ALL_USERS {
public String name;
public String SonyTV;
public String Date;
public ALL_USERS() {
}
public ALL_USERS(String name, String sonyTV, String date) {
this.name = name;
SonyTV = sonyTV;
Date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSonyTV() {
return SonyTV;
}
public void setSonyTV(String sonyTV) {
SonyTV = sonyTV;
}
public String getDate() {
return Date;
}
public void setDate(String date) {
Date = date;
}
}
我的日志猫:
E/AndroidRuntime: 致命异常: main
com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: date
at com.google.firebase.database.obfuscated.zzbw$zza.zza(com.google.firebase:firebase-database@@16.0.3:545)
at com.google.firebase.database.obfuscated.zzbw$zza.<init>(com.google.firebase:firebase-database@@16.0.3:476)
at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:317)
at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:2418)
at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.0.3:212)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
at an
我的第二个 Logcat
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:2413)
at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:178)
at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:47)
at com.google.firebase.database.obfuscated.zzbw$zza.zza(com.google.firebase:firebase-database@@16.0.3:591)
at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:2550)
at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.0.3:212)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
at
android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
at android.view.View.layout(View.java:16962)
at android.view.ViewGroup.layout(ViewGroup.java:5620)
解决方案
您的代码中的问题在于您的ALL_USERS
类中有一个名为的字段Date
,但您使用的是一个名为的 getter getDate()
,这是不正确的,因为 Firebase 正在数据库中查找名为date
而不是的字段Date
。看到小写d
字母与大写字母了D
吗?
有两种方法可以解决此问题。第一个是通过根据Java Naming Conventions重命名字段来更改模型类。所以你的模型类应该是这样的:
public class ALL_USERS {
private String name, sonyTV;
private long date;
public ALL_USERS() {}
public ALL_USERS(String name, String sonyTV, long date) {
this.name = name;
this.sonyTV = sonyTV;
this.date = date;
}
public String getName() { return name; }
public String getSonyTV() { return sonyTV; }
public long getDate() { return date; }
}
请参阅在此示例中,有private
字段和公共 getter。还有一个更简单的解决方案,直接在公共字段上设置值,如下所示:
public class ALL_USERS {
public String name, sonyTV;
public long date;
}
现在只需删除当前数据并使用正确的名称再次添加它。此解决方案仅在您处于测试阶段时才有效。
还有第二种方法,就是使用annotations
. 因此,如果您更喜欢使用私有字段和公共 getter,则应仅在 getter 前面使用PropertyName注释。所以你的ALL_USERS
班级应该是这样的:
public class ALL_USERS {
private String name, SonyTV;
private long Date;
public ALL_USERS() {}
public ALL_USERS(String name, String sonyTV, long date) {
this.name = name;
SonyTV = sonyTV;
Date = date;
}
public String getName() { return mame; }
@PropertyName("SonyTV")
public String getSonyTV() { return SonyTV; }
@PropertyName("Date")
public long getDate() { return Date; }
}
推荐阅读
- c# - 大关注册总是失败
- java - JDBC ORA-00955: 名称已被现有对象使用
- javascript - 如何将一个 .js 文件中的变量访问到另一个 html 文件中?
- swift - Swift - 如何使整数符合 D6?
- python - Bokeh server 和 Bokeh JS 在速度方面有什么区别吗?
- java - 当 Play 商店发布新版本时,Android 应用程序将自动更新
- linux - Unix - sed 命令仅替换由 | 分隔的第一个字符串 在一个文件中
- java - Cisco AXL - 执行 SQL 查询,解析响应
- swift - 无法将“String.Type”类型的值转换为 super.init 的预期参数类型“String”
- python - 无法使用openCV获取对象的中心