You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FirestoreRecyclerAdapter实现带回复的嵌套RecyclerView?

如何通过FirestoreRecyclerAdapter实现嵌套RecyclerView(仿Instagram评论回复功能)

我想为社交类应用开发类似Instagram的评论与回复功能,想确认是否可以通过FirestoreRecyclerAdapter实现嵌套RecyclerView。以下是我的现有代码结构,以及尝试在FirestoreRecyclerAdapter的ViewHolder中重复创建适配器的实现思路,但未能成功,也不确定这是否为正确的实现方式,附带相关代码。


原代码结构

主列表初始化代码:

homeRecycler = findViewById(R.id.homeRecycler);
linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
homeRecycler.setLayoutManager(linearLayoutManager);

homeRecycler.setItemAnimator(null);


StorageReference profileRef = storageReference.child("ProfileImage/"+fAuth.getCurrentUser().getUid()+"/profile.jpg");
profileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        Picasso.get().load(uri).into(prof_img);
    }
});

Query query = fStore.collection("Post")
        .orderBy("homePostDate", Query.Direction.DESCENDING)
        .limit(50);


FirestoreRecyclerOptions<HomeModel> options = new FirestoreRecyclerOptions.Builder<HomeModel>()
        .setQuery(query, HomeModel.class)
        .build();

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onRefresh() {
        adapter.notifyDataSetChanged();
        swipeRefresh.setRefreshing(false);
    }
});

adapter = new FirestoreRecyclerAdapter<HomeModel, ViewHolder>(options) {
    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull HomeModel model) {
        holder.bind(model);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup group, int i) {
        View view = LayoutInflater.from(group.getContext())
                .inflate(R.layout.home_each, group,false);
        return new ViewHolder(view);
    }
};

homeRecycler.setAdapter(adapter);

主列表ViewHolder:

class ViewHolder extends RecyclerView.ViewHolder{
    TextView author, title, body, authorUid, docId, timestamp, upvotecount, downvotecount;
    Button addcoment;
    ToggleButton upvote, downvote;
    ImageView prof_img;
    HomeModel model;
    RecyclerView replyRecycler;

    public ViewHolder(@NonNull View itemView) {...}

    public void bind(HomeModel homeModel) {...}
}

尝试实现嵌套的代码

评论列表嵌套回复列表的尝试代码:

commentRecycler = findViewById(R.id.commentRecycler);
linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
commentRecycler.setLayoutManager(linearLayoutManager);

commentRecycler.setItemAnimator(null);

Query query = fStore.collection("Post")
        .document(pdocId.getText().toString()).collection("comment")
        .orderBy("commentPostDate", Query.Direction.DESCENDING)
        .limit(50);

FirestoreRecyclerOptions<CommentModel> options = new FirestoreRecyclerOptions.Builder<CommentModel>()
        .setQuery(query, CommentModel.class)
        .build();

adapter = new FirestoreRecyclerAdapter<CommentModel, ViewHolder>(options) {
    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull CommentModel model) {
        holder.bind(model);

        linearLayoutManager2 = new LinearLayoutManager(HomeView.this, RecyclerView.VERTICAL, false);
        holder.replyRecycler.setLayoutManager(linearLayoutManager2);

        holder.replyRecycler.setItemAnimator(null);

        Query query2 = fStore.collection("Post")
                .document(pdocId.getText().toString()).collection("comment")
                .document(model.docId).collection("reply")
                .orderBy("commentPostDate", Query.Direction.DESCENDING)
                .limit(50);

        FirestoreRecyclerOptions<ReplyModel> options2 = new FirestoreRecyclerOptions.Builder<ReplyModel>()
                .setQuery(query2, ReplyModel.class)
                .build();

        adapter2 = new FirestoreRecyclerAdapter<ReplyModel, ViewHolder2>(options2) {
            @Override
            protected void onBindViewHolder(@NonNull ViewHolder2 holder, int position, @NonNull ReplyModel model) {
                holder.bind(model);
                Toast.makeText(HomeView.this, "this is test", Toast.LENGTH_SHORT).show();
            }

            @NonNull
            @Override
            public ViewHolder2 onCreateViewHolder(@NonNull ViewGroup group, int i) {
                View view = LayoutInflater.from(group.getContext())
                        .inflate(R.layout.comment_each, group,false);
                return new ViewHolder2(view);
            }
        };

        holder.replyRecycler.setAdapter(adapter2);

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup group, int i) {
        View view = LayoutInflater.from(group.getContext())
                .inflate(R.layout.comment_each, group,false);
        return new ViewHolder(view);
    }
};

commentRecycler.setAdapter(adapter);

新增的ViewHolder类

评论列表ViewHolder与回复列表ViewHolder:

class ViewHolder extends RecyclerView.ViewHolder{
    TextView author, body, authorUid, docId, timestamp, pReply, upvotecount, downvotecount;
    TextInputLayout tilpReply;
    ImageView prof_img;
    Chip replyChip;
    ToggleButton upvote, downvote;
    ToggleButton replypop;
    Button replyBtn;
    CommentModel model;
    RecyclerView replyRecycler;

    public ViewHolder(@NonNull View itemView){...}
    public void bind(CommentModel commentModel){...}
}
class ViewHolder2 extends RecyclerView.ViewHolder{
    TextView author, body, authorUid, docId, timestamp, pReply, upvotecount, downvotecount;
    TextInputLayout tilpReply;
    ImageView prof_img;
    Chip replyChip;
    ToggleButton upvote, downvote;
    ToggleButton replypop;
    Button replyBtn;
    CommentModel model;
    RecyclerView replyRecycler;

    public ViewHolder2(@NonNull View itemView){...}
    public void bind(CommentModel commentModel){...}
}

内容的提问来源于stack exchange,提问作者czrest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:15:43