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中一次性加载所有班级和对应的成员数据,封装为自定义数据类后再传给适配器,避免在列表滚动时重复发起数据库请求,提升滑动流畅度:
- 新建数据类
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; } }
- 在Fragment中完成全量数据的组装后再初始化GroupAdp即可。
内容的提问来源于stack exchange,提问作者Wentao Yang
相关产品推荐
相关产品推荐

