首页 > 解决方案 > 让特定的孩子进入 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)

标签: javaandroidfirebasefirebase-realtime-database

解决方案


您的代码中的问题在于您的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; }
}

推荐阅读