首页 > 解决方案 > 一切都归于一个列表

问题描述

我目前遇到的问题是所有内容都返回到同一个列表。我知道这是因为我将所有内容都添加到同一个数组中。但是如何将它们添加到特定位置,例如我的火力基地中的位置。

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 中的存储方式将他们返回到不同的列表中。

标签: javafirebaseandroid-studio

解决方案


问题是您订阅了 data 的根目录Course_ID_Section,因此您以相同的方式获取所有数据,而无需考虑其 Courses id。有几种方法可以处理它,但在你的情况下,我会推荐以下方法:

不是将学生存储在同一个数组arrayListMember中,而是存储在 Hashtable(或另一个关联数组实现)中,或者存储在一个新Course类中。然后,当你循环遍历你的 line 中的课程时,填写你的新数据结构arrayListMember.add(userSnapshot.getValue(String.class)),因为此时你有一个关于学生的数据,并courseSnapshot获取课程的名称


推荐阅读