为什么firebase回收器适配器返回null

问题描述 投票:0回答:1

我真的被困在这里,我需要获得在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。如何排除这些讨厌的事情?

android firebase-realtime-database recycler-adapter
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.