Я действительно застрял здесь, мне нужно получить значение класса Post, которое хранится в users/user_id/latest_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.Но мой адаптер для вторичной переработки и держатель представления, похоже, не используют это, и когда я пытаюсь настроить представление переработчика, он говорит, что значение, которое он пытается получить, равно нулю.
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);
...
}
Начало файла, который я держу: Post post;
, который обновляется значениями в childEventListener.Любые идеи, где я облажался?Спасибо.
ОБНОВЛЕНИЕ:
Я внес эти изменения, используя мой класс User, который содержит класс Post (latest_post):
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, что приводит к сбою из-за нуля.
ОБНОВЛЕНИЕ 2:
Получениеближе, это работает:
query = FirebaseDatabase.getInstance()
.getReference()
.child("users").orderByChild("latest_post");
Я предполагаю, потому что это заказывает их пользователями, у которых есть last_post, но это терпит крах, если я прокручиваю к основанию, потому что Тогда все остальные все еще там, таким образом это пытаетсяустановить строковое значение для textView, когда оно равно нулю.Как исключить эти неприятные вещи?