Почему адаптер утилизации Firebase возвращает ноль - PullRequest
0 голосов
/ 23 февраля 2019

Я действительно застрял здесь, мне нужно получить значение класса 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, когда оно равно нулю.Как исключить эти неприятные вещи?

1 Ответ

0 голосов
/ 07 марта 2019

Это произошло потому, что вы не можете отфильтровать запрос, чтобы исключить несуществующие посты, и у вас нет доступа к списку, который firebaseRecyclerAdapter использует.Единственное решение, позволяющее точно и безопасно фильтровать данные так, как мне было нужно, - это использовать специальный адаптер recyclerView и список моего класса, а также фильтровать и упорядочивать этот список по мере необходимости после запроса.

...