Вложенный адаптер Firebaserecycler

# #java #android #firebase

Вопрос:

Я создаю приложение, и мне нужно использовать вложенный FirebaseRecyclerAdapter. Но я не могу найти в Интернете примеров того, как это сделать правильно, может быть, кто-нибудь может показать на примере, как это сделать правильно.

Вот мой основной адаптер, внутри которого мне нужно реализовать второй адаптер:

 FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<DataSnapshot>()
                .setLifecycleOwner((LifecycleOwner)mContext)
                .setQuery(FirebaseDatabase.getInstance().getReference("Posts").child(postId).child("Comments"), new SnapshotParser<DataSnapshot>() {
                    @NonNull
                    @Override
                    public DataSnapshot parseSnapshot(@NonNull DataSnapshot snapshot) {
                        return snapshot;
                    }
                }).build();

        adapter = new FirebaseRecyclerAdapter<DataSnapshot, CommentAdapter>(options)
        {
            @NonNull
            @Override
            public CommentAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.comments, parent, false);
                return new CommentAdapter(view);
            }


            @Override
            protected void onBindViewHolder(@NonNull CommentAdapter holder, int position, @NonNull DataSnapshot model) {
                String comment = model.child("comment").getValue(String.class);
                Long dateLong = Long.parseLong(model.child("time").getValue(String.class));
                commentID = model.child("commentId").getValue(String.class);

                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyy HH:mm");
                Date date = new Date(dateLong);

                Query query = postsReference.orderByKey().equalTo(postId);
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        for(DataSnapshot dataSnapshot : snapshot.getChildren())
                        {
                            String image = dataSnapshot.child("avatarUri").getValue(String.class);
                            String nickname = dataSnapshot.child("nickname").getValue(String.class);

                            Picasso.get().load(image).into(holder.avatar);
                            holder.nick.setText(nickname);
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });
                
                holder.comment.setText(comment);
                holder.date.setText(simpleDateFormat.format(date));

                holder.reply.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        writeComment.setText("@"   holder.nick.getText() " ");
                        replyLayout.setVisibility(View.VISIBLE);
                        replyLayout.setBackgroundColor(Color.parseColor("#FF262726"));
                        replyTo.setText("Replying to "   holder.nick.getText());

                    }
                });

                replyLinearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
                holder.mRecyclerView.setLayoutManager(replyLinearLayoutManager);
                holder.mRecyclerView.setHasFixedSize(true);
 

FirebaseRecyclerAdapter replyAdapter = setReplyAdapter();

             holder.mRecyclerView.setAdapter(replyAdapter);
            replyAdapter.startListening();
            }
        };
 

Класс ответов:

 public class Reply {
    private String userId;
    private String comment;
    private String date;
    private String commentId;
    
    public Reply()
    {

    }

    public Reply(String userId, String comment, String date, String commentId)
    {
        this.comment = comment;
        this.userId = userId;
        this.date = date;
        this.commentId = commentId;
    }
    
    public String getCommentId() {
        return commentId;
    }

    public void setCommentId(String commentId) {
        this.commentId = commentId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getDate() {
        return date;
    }

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

ReplyRecyclerViewAdapter:

 public class ReplyRecyclerViewAdapter extends RecyclerView.ViewHolder{
     CircleImageView avatar;
     TextView nick, comment, date, reply;

    public ReplyRecyclerViewAdapter(@NonNull View view) {
        super(view);

        avatar = view.findViewById(R.id.commentator_avatar_reply);
        nick = view.findViewById(R.id.commentator_nick_reply);
        comment = view.findViewById(R.id.comment_text_reply);
        date = view.findViewById(R.id.reply_date);
        reply = view.findViewById(R.id.reply);
    }
}
 

И это метод, в котором я вызываю инициализацию вложенного адаптера, но у меня проблема в том, что, когда я пытаюсь вызвать переменную этого класса из holder, переменная их не видит. Я пометил эти поля комментариями в коде.

  private FirebaseRecyclerAdapter setReplyAdapter()
    {
        FirebaseRecyclerOptions optionsReply = new FirebaseRecyclerOptions.Builder<DataSnapshot>()
                .setLifecycleOwner((LifecycleOwner)mContext)
                .setQuery(FirebaseDatabase.getInstance().getReference("Posts").child(postId).child("Comments").child(commentID).child("Reply"), new SnapshotParser<DataSnapshot>() {
                    @NonNull
                    @Override
                    public DataSnapshot parseSnapshot(@NonNull DataSnapshot snapshot) {
                        return snapshot;
                    }
                }).build();

        FirebaseRecyclerAdapter replyAdapter = new FirebaseRecyclerAdapter<DataSnapshot, ReplyRecyclerViewAdapter>(optionsReply)
        {

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

                return new ReplyRecyclerViewAdapter(view);
            }


            @Override
            protected void onBindViewHolder(@NonNull ReplyRecyclerViewAdapter holder, int position, @NonNull DataSnapshot model) {
                String comment = model.child("comment").getValue(String.class);
                Long dateLong = Long.parseLong(model.child("time").getValue(String.class));
                commentID = model.child("commentId").getValue(String.class);
                replyReference = FirebaseDatabase.getInstance().getReference("Posts").child(postId).child("Comments").child(commentID).child("Reply");

                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyy HH:mm");

               Date date = new Date(dateLong);

                Query query = postsReference.orderByKey().equalTo(postId);
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        for(DataSnapshot dataSnapshot : snapshot.getChildren())
                        {
                            String image = dataSnapshot.child("avatarUri").getValue(String.class);
                            String nickname = dataSnapshot.child("nickname").getValue(String.class);


                            Picasso.get().load(image).into(holder.avatar); //holder.avatar it cannot find avatar variable
                            holder.nick.setText(nickname); //the same is here
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });


                holder.comment.setText(comment); //here
                holder.date.setText(simpleDateFormat.format(date)); //here
                
            }
        };

        return replyAdapter;
    }
 

Комментарии:

1. @AlexMamo Я добавил еще немного информации, надеюсь, это поможет

2. Скорее всего, вам следует использовать свои собственные адаптеры.