我真的被困在这里,我需要获得在users/user_id/latest_post
中保存的Post类值,只有一些用户具有此值。所以我认为:
query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
if (dataSnapshot.hasChild("latest_post")) {
Post latest = dataSnapshot.child("latest_post").getValue(Post.class);
latest_posts = latest;
post = latest;
}
}
应该工作,它确实得到了我的价值观,并忽略了那些不包含latest_posts孩子的价值观。但是我的回收器适配器和视图持有者似乎没有使用它,当我尝试设置回收器视图时,它说它试图得到的值为null。
FirebaseRecyclerOptions<Post> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<Post>()
.setQuery(query, Post.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Post, PostHolder>(firebaseRecyclerOptions) {
@Override
protected void onBindViewHolder(@NonNull PostHolder postHolder, int position, @NonNull Post post) {
postHolder.setPost(post);
}
@Override
public PostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_content, parent, false);
return new PostHolder(view);
}
};
这是firebase适配器的其余部分^然后这里是setPost函数:
void setPost(Post post) {
String key = post.getPost_id();
Integer reads = post.getReads();
String titleString = post.getTitle();
String bodyString = post.getBody();
String usernameString = post.getAuthor();
String category = post.getCategory();
System.out.println("setPost " + usernameString);
...
}
我持有的文件顶部:帖子后;
使用childEventListener中的值更新。我搞砸的任何想法?谢谢。
更新:
我使用包含Post类(latest_post)的User类进行了这些更改:
void setupRecycler(Query query) {
query = FirebaseDatabase.getInstance()
.getReference()
.child("users");
FirebaseRecyclerOptions<User> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<User>()
.setQuery(query, User.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<User, PostHolder>(firebaseRecyclerOptions) {
@Override
protected void onBindViewHolder(@NonNull PostHolder postHolder, int position, @NonNull User user) {
if (user.getLatest_post().getAuthor() != null) {
postHolder.setPost(user);
}
}
@Override
public PostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_content, parent, false);
return new PostHolder(view);
}
};
}
现在我试图在调用setPost(user)时进行过滤,因此只有在latest_posts值不为null时才会通过。但我必须误解一些东西,因为它给了我前两个名字,但仍然试图使用没有latest_post的vaues,这会因为null而导致崩溃。
更新2:
越来越近,这有效:
query = FirebaseDatabase.getInstance()
.getReference()
.child("users").orderByChild("latest_post");
我猜是因为它由具有latest_post的用户命令它们,但是如果我滚动到底部它会崩溃因为然后所有其余的仍然存在,所以当它为null时它会尝试将字符串值设置为textView。如何排除这些讨厌的事情?
这是因为您无法过滤查询以排除不存在的帖子,并且您无权访问firebaseRecyclerAdapter
使用的列表。以我需要的方式准确,安全地过滤数据的唯一解决方案是使用自定义的recyclerView适配器和我的类列表,并在查询后根据需要过滤和排序列表。