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

Android嵌套RecyclerView加载Firebase课程数据所有分组返回同一名单问题

问题解决办法

核心问题原因

  • 你在GroupAdp的onBindViewHolder方法中没有将查询结果和当前position对应的班级绑定,每次都遍历了Firebase中所有班级的用户,导致所有分组的成员列表数据重复
  • 原有逻辑只筛选了当前登录用户自己的信息,没有加载同班其他用户的数据
  • 在onBindViewHolder中重复注册Firebase实时监听器,列表滚动时会产生内存泄漏、数据重复加载的问题

修复代码

第一步:修改GroupAdp的onBindViewHolder逻辑

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    // 拿到当前位置对应的班级ID
    String currentCourseId = arrayListGroup.get(position);
    holder.tvName.setText(currentCourseId);

    ArrayList<String> arrayListMember = new ArrayList<>();
    MemberAdp adapterMember = new MemberAdp(arrayListMember);
    LinearLayoutManager layoutManagerMember = new LinearLayoutManager(activity);
    holder.rvMember.setLayoutManager(layoutManagerMember);
    holder.rvMember.setAdapter(adapterMember);

    // 只查询当前班级的节点,不要拉取全量班级数据
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Course_ID_Section").child(currentCourseId);
    reference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            if(user == null) return;
            String UID = user.getUid();
            // 先判断当前登录用户是否属于这个班级
            if(!snapshot.hasChild(UID)) {
                arrayListMember.clear();
                adapterMember.notifyDataSetChanged();
                return;
            }
            // 加载当前班级所有成员信息
            arrayListMember.clear();
            for (DataSnapshot userSnapshot: snapshot.getChildren()) {
                arrayListMember.add(userSnapshot.getValue(String.class));
            }
            adapterMember.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.e("GroupAdp", "加载班级成员失败", error.toException());
        }
    });
}

性能优化建议

如果班级数量较多,建议在HealthAlertActivity2中一次性加载所有班级和对应的成员数据,封装为自定义数据类后再传给适配器,避免在列表滚动时重复发起数据库请求,提升滑动流畅度:

  1. 新建数据类CourseItem
public class CourseItem {
    private String courseId;
    private List<String> memberList;

    public CourseItem(String courseId, List<String> memberList) {
        this.courseId = courseId;
        this.memberList = memberList;
    }

    public String getCourseId() { return courseId; }
    public List<String> getMemberList() { return memberList; }
}
  1. 在Fragment中完成全量数据的组装后再初始化GroupAdp即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 01:36:03