无法获取 RecyclerView 的 child 个当前用户 ID
Unable to get child of Current User Id for RecyclerView
我想使用 getCurrentUser().getUid()
将 RecyclerView 设置为当前用户 ID 的 Child。您可以在下图中看到数据结构,
在上图中,SQyOq80egYehjqx4sgiyeNcW8P02 是 current 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
属性。您可能需要修改它以适合您的具体用例。
我想使用 getCurrentUser().getUid()
将 RecyclerView 设置为当前用户 ID 的 Child。您可以在下图中看到数据结构,
在上图中,SQyOq80egYehjqx4sgiyeNcW8P02 是 current 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
属性。您可能需要修改它以适合您的具体用例。