Невозможно получить дочерний идентификатор текущего идентификатора пользователя для RecyclerView - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу установить RecyclerView с потомком текущего идентификатора пользователя, используя getCurrentUser().getUid(). Структура данных, которую вы можете увидеть на изображении ниже, enter image description here

На изображении выше, SQyOq80egYehjqx4sgiyeNcW8P02 is текущий userId , и я хочу получить все дочерние элементы этого идентификатора и показать в RecyclerView.На изображении выше дочерний элемент wed5qPTCdcQVzVlRcBrMo1NX43v1 , и его значение равно 29 сентября 2018 .Мой вопрос заключается в том, как получить эти childern значения отдельно и показать в RecyclerView.В качестве примера я написал код для Date (значение текущего userId), который дает фатальную ошибку.Я знаю ошибку в классе Model, которую не могу понять.

Примечание: эта строка выдает ошибку.Log.d("sdfsdfdgfdfsdfd", blogPost.getDate());

Активность:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        Query query = rootRef.child("Friends").child(uid);

        FirebaseRecyclerOptions<BlogPost> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<BlogPost>()
                .setQuery(query, BlogPost.class)
                .build();

        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<BlogPost, BlogPostHolder>(firebaseRecyclerOptions) {
            @Override
            protected void onBindViewHolder(@NonNull BlogPostHolder blogPostHolder, int position, @NonNull BlogPost blogPost) {

                Log.d("sdfsdfdgfdfsdfd", blogPost.getDate());
                blogPostHolder.setBlogPost(blogPost);
            }

            @Override
            public BlogPostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);

                return new BlogPostHolder(view);
            }
        };
        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();

        if (firebaseRecyclerAdapter!= null) {
            firebaseRecyclerAdapter.stopListening();
        }
    }

    private class BlogPostHolder extends RecyclerView.ViewHolder {
        private TextView  userDateTextView;

        BlogPostHolder(View itemView) {
            super(itemView);
            userDateTextView = itemView.findViewById(R.id.user_date);
        }

        void setBlogPost(BlogPost blogPost) {
            String date = blogPost.getDate();
            userDateTextView.setText(date);
        }
    }
}

Модель:

public class BlogPost {
    public String date;

    public BlogPost() {}

    public BlogPost(String date) {
        this.date = date;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }


}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

* * * * wed5qPTCdcQVzVlRcBrMo1NX43v1 в вашем JSON выглядит динамически, что означает, что у каждого пользователя свой ключ.Клиент Firebase не имеет возможности преобразовать эту информацию в ваш класс BlogPost, который имеет только статические свойства.

Это означает, что вам нужно будет предоставить собственный класс SnapshotParser для преобразования DataSnapshot вBlogPost объект.Основываясь на документации FirebaseUI , которая должна выглядеть примерно так:

FirebaseRecyclerOptions<BlogPost> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<BlogPost>()
  .setQuery(query, , new SnapshotParser<Chat>() {
    @NonNull
    @Override
    public BlogPost parseSnapshot(@NonNull DataSnapshot snapshot) {
        // first let Firebase read any static properties
        BlogPost post = snapshot.getValue(BlogPost.class); 

        // then do the parsing of the dynamic properties ourselves
        for (DataSnapshot friendSnapshot: snapshot.getChildren()) {
            String friendUID = friendSnapshot.getKey();
            String friendDate = friendSnapshot.getValue(String.class);

            post.setDate(friendDate);
        }

        return post;
    }
}).build();

Приведенный выше код вызывается FirebaseUI для каждого нового снимка, который он получает из базы данных.Сначала он вызывает snapshot.getValue(BlogPost.class), чтобы преобразовать статические части JSON в post, а затем сам анализирует друзей.На данный момент он устанавливает любое значение, которое находит в свойстве date сообщения.Возможно, вам придется изменить это в соответствии с вашим конкретным вариантом использования.

0 голосов
/ 30 сентября 2018

изменить дочерний ключ в базе данных на дату

enter image description here

...