为什么Firebase Recycler适配器返回null

时间:2019-02-23 17:39:27

标签: android firebase-realtime-database recycler-adapter

我真的很困在这里,我只需要获取保存在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时空值。如何排除这些讨厌的东西?

1 个答案:

答案 0 :(得分:0)

这是因为您无法过滤查询以排除不存在的帖子,并且您无权访问firebaseRecyclerAdapter使用的列表。准确和安全地过滤所需数据的唯一方法是使用自定义recyclerView Adapter和类列表,并在查询后根据需要过滤和排序列表。