无法获取 RecyclerView 的 child 个当前用户 ID

Unable to get child of Current User Id for RecyclerView

我想使用 getCurrentUser().getUid() 将 RecyclerView 设置为当前用户 ID 的 Child。您可以在下图中看到数据结构,

在上图中,SQyOq80egYehjqx4sgiyeNcW8P02current userId 我想获取所有 child 这些 id 并显示在回收视图。在上图中,child 是 wed5qPTCdcQVzVlRcBrMo1NX43v1,它们的值是 Sep 29, 2018。我的问题是如何分别获取这些 childern 值并显示在 RecyclerView 中。例如,我为 Date(当前 userId 的值)编写了代码,这给出了致命错误。我知道模型 class 中的错误,我无法理解。

注:这一行报错。 Log.d("sdfsdfdgfdfsdfd", blogPost.getDate());

Activity:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        Query query = rootRef.child("Friends").child(uid);

        FirebaseRecyclerOptions<BlogPost> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<BlogPost>()
                .setQuery(query, BlogPost.class)
                .build();

        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<BlogPost, BlogPostHolder>(firebaseRecyclerOptions) {
            @Override
            protected void onBindViewHolder(@NonNull BlogPostHolder blogPostHolder, int position, @NonNull BlogPost blogPost) {

                Log.d("sdfsdfdgfdfsdfd", blogPost.getDate());
                blogPostHolder.setBlogPost(blogPost);
            }

            @Override
            public BlogPostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);

                return new BlogPostHolder(view);
            }
        };
        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();

        if (firebaseRecyclerAdapter!= null) {
            firebaseRecyclerAdapter.stopListening();
        }
    }

    private class BlogPostHolder extends RecyclerView.ViewHolder {
        private TextView  userDateTextView;

        BlogPostHolder(View itemView) {
            super(itemView);
            userDateTextView = itemView.findViewById(R.id.user_date);
        }

        void setBlogPost(BlogPost blogPost) {
            String date = blogPost.getDate();
            userDateTextView.setText(date);
        }
    }
}

型号:

public class BlogPost {
    public String date;

    public BlogPost() {}

    public BlogPost(String date) {
        this.date = date;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }


}

将 firebase 中的子键更改为日期

您的 JSON 中的 wed5qPTCdcQVzVlRcBrMo1NX43v1 似乎是动态的,这意味着每个用户都有不同的密钥。 Firebase 客户端无法将该信息解析为您的 BlogPost class,它只有静态属性。

这意味着您必须提供自己的 SnapshotParser class 才能将 DataSnapshot 转换为 BlogPost 对象。基于 FirebaseUI documentation 应该看起来像这样:

FirebaseRecyclerOptions<BlogPost> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<BlogPost>()
  .setQuery(query, , new SnapshotParser<Chat>() {
    @NonNull
    @Override
    public BlogPost parseSnapshot(@NonNull DataSnapshot snapshot) {
        // first let Firebase read any static properties
        BlogPost post = snapshot.getValue(BlogPost.class); 

        // then do the parsing of the dynamic properties ourselves
        for (DataSnapshot friendSnapshot: snapshot.getChildren()) {
            String friendUID = friendSnapshot.getKey();
            String friendDate = friendSnapshot.getValue(String.class);

            post.setDate(friendDate);
        }

        return post;
    }
}).build();

FirebaseUI 为从数据库中获取的每个新快照调用上述代码。它首先调用 snapshot.getValue(BlogPost.class) 将 JSON 的静态部分转换为 post,然后解析朋友本身。现在它将找到的任何值设置为 post 的 date 属性。您可能需要修改它以适合您的具体用例。