首页 > 解决方案 > 嵌套的 FIrebaseRecyclerAdapter

问题描述

我正在创建一个应用程序,我需要使用嵌套的 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;
    }
}

回复RecyclerViewAdapter:

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);
    }
}

这是我调用嵌套适配器初始化的方法,但是我有一个问题,当我尝试从持有者调用此类的变量时,变量看不到它们。我在代码中用注释标记了这些字段。

 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;
    }

标签: javaandroidfirebase

解决方案


推荐阅读