我真的很困在这里,我只需要获取保存在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时,它才能通过。但是我一定误会了一些东西,因为它给了我前两个名字,但仍然尝试使用没有last_post的值,由于null而导致崩溃。
更新2:
拉近距离,这可行:
query = FirebaseDatabase.getInstance()
.getReference()
.child("users").orderByChild("latest_post");
我正在猜测,因为它由具有last_post的用户对它们进行排序,但是如果我滚动到底部,它会崩溃,因为其余所有内容都仍然存在,因此它尝试将字符串值设置为textView时空值。如何排除这些讨厌的东西?
答案 0 :(得分:0)
这是因为您无法过滤查询以排除不存在的帖子,并且您无权访问firebaseRecyclerAdapter
使用的列表。准确和安全地过滤所需数据的唯一方法是使用自定义recyclerView Adapter和类列表,并在查询后根据需要过滤和排序列表。