java - 一切都归于一个列表
问题描述
我目前遇到的问题是所有内容都返回到同一个列表。我知道这是因为我将所有内容都添加到同一个数组中。但是如何将它们添加到特定位置,例如我的火力基地中的位置。
public class GroupAdp extends RecyclerView.Adapter<GroupAdp.ViewHolder> {
//Initialize activities and array list
private Activity activity;
ArrayList<String> arrayListGroup;
MemberAdp adapterMember;
//Create constructor
GroupAdp(Activity activity,ArrayList<String> arrayListGroup){
this.activity = activity;
this.arrayListGroup = arrayListGroup;
// notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_row_group,parent,false);
return new GroupAdp.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//Set group name on TextView
holder.tvName.setText(arrayListGroup.get(position));
//Initialize member ArrayList
ArrayList<String> arrayListMember = new ArrayList<>();
//Using for loop to add multiple members
// for (int i=1; i<=6; i++){
// arrayListMember.add("Member " + i);
// }
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Course_ID_Section");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String UID = user.getUid();
for (DataSnapshot courseSnapshot: snapshot.getChildren()) {
for (DataSnapshot userSnapshot: courseSnapshot.getChildren()) {
// arrayListMember.add(userSnapshot.getValue(String.class));
if(UID.equals(userSnapshot.getKey())) {
arrayListMember.add(userSnapshot.getValue(String.class));
}
}
}
adapterMember.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
//Initialize member adapter
adapterMember = new MemberAdp(arrayListMember);
//Initialize layout manager
LinearLayoutManager layoutManagerMember = new LinearLayoutManager(activity);
//Set layout manager
holder.rvMember.setLayoutManager(layoutManagerMember);
//Set adapter
holder.rvMember.setAdapter(adapterMember);
}
@Override
public int getItemCount() {
return arrayListGroup.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
//Initialize variable
TextView tvName;
RecyclerView rvMember;
public ViewHolder(@NonNull View itemView) {
super(itemView);
//Assign variable
tvName = itemView.findViewById(R.id.tv_name);
rvMember = itemView.findViewById(R.id.rv_member);
}
}
}
public class HealthAlertActivity2 extends Fragment {
//Initialize variable
RecyclerView rvGroup;
ArrayList<String> arrayListGroup;
LinearLayoutManager layoutManagerGroup;
GroupAdp adapterGroup;
//@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View healthAlertFragment = inflater.inflate(R.layout.healthalert_activity2, container, false);
//Assign variable
rvGroup = healthAlertFragment.findViewById(R.id.rv_group);
//Using for loop to add multiple group
//Used for dummy display for now
// for (int i= 1; i<=6; i++){
// arrayListGroup.add("Group " + i);
// }
ArrayList<String> arrayListGroup = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Course_ID_Section");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String UID = user.getUid();
Map<String, Object> map = (Map<String, Object>) snapshot.getValue();
Log.e("LOG_TAG", "Value:" + map);
assert map != null;
for (Map.Entry<String, Object> entry : map.entrySet()) {
Log.e("The Result", entry.getKey());
arrayListGroup.add(entry.getKey());
}
adapterGroup.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.e("LOG_TAG", "Failed to read value.", error.toException());
}
});
//Initialize group adapter
adapterGroup = new GroupAdp(getActivity(), arrayListGroup);
//Initialize layout manager
layoutManagerGroup = new LinearLayoutManager(getActivity());
//Set layout manager
rvGroup.setLayoutManager(layoutManagerGroup);
//Set adapter
rvGroup.setAdapter(adapterGroup);
return healthAlertFragment;
}
}
public class MemberAdp extends RecyclerView.Adapter<MemberAdp.ViewHolder> {
//Initialize ArrayList
ArrayList<String> arrayListMember;
//Create constructor
public MemberAdp(ArrayList<String> arrayListMember) {
this.arrayListMember = arrayListMember;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//Initialize view
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_row_member,parent,false);
return new MemberAdp.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//Set member name on TextView
holder.tvName.setText(arrayListMember.get(position));
}
@Override
public int getItemCount() {
return arrayListMember.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
//Initialize variable
TextView tvName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
//Assign variable
tvName = itemView.findViewById(R.id.tv_name);
}
}
}
理想情况下,我想返回与 firebase 中的用户具有相同班级的所有学生,并根据他们在 firebase 中的存储方式将他们返回到不同的列表中。
解决方案
问题是您订阅了 data 的根目录Course_ID_Section
,因此您以相同的方式获取所有数据,而无需考虑其 Courses id。有几种方法可以处理它,但在你的情况下,我会推荐以下方法:
不是将学生存储在同一个数组arrayListMember
中,而是存储在 Hashtable(或另一个关联数组实现)中,或者存储在一个新Course
类中。然后,当你循环遍历你的 line 中的课程时,填写你的新数据结构arrayListMember.add(userSnapshot.getValue(String.class))
,因为此时你有一个关于学生的数据,并courseSnapshot
获取课程的名称
推荐阅读
- android - 使用谷歌地图突出显示实时轨迹
- php - 使用 INNER JOIN 语句连接 3 个表的问题
- flutter - 在颤动中暂停和恢复 FirebaseAuth 状态更改侦听器
- windows - 虚拟地址中的 ImageBase 地址之前有什么?
- javascript - 如何在 Node.js 中解析和修改 XHTML(支持 HTML 实体和 CDATA 部分)?
- php - 我正在尝试使用 laravel 刀片模板使单选按钮具有粘性
- python - 反转特定的单词功能
- node.js - 绑定一个在会话被移除后自动调用的函数
- python - Discord Bot Image Scraper 使用 Praw - 错误
- c++ - 抽象方法的 C++ 模板返回类型(类似于 java)