有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Firebase在列表中添加来自不同子级的值?

请帮帮我,我正试图在child("complaints")child("complainee")中获取数据。收集的数据必须存储在列表中。儿童(“投诉”)列表和{}儿童的{}列表。但是,当我显示它时,list2是空的。先谢谢你

Here is my data structure in firebase

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("complaints");

        list = new ArrayList<Blog>();
        list2 = new ArrayList<Complainee>();

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try{

                    for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){

                        final Blog value = dataSnapshot1.getValue(Blog.class);
                        Boolean Posted = value.getPosted();
                        String complaint_type = value.getComplaintType();

                        if(complaint_type.equals("Personal Complaint")) {

                            final int ComplaintNo = value.getComplaintNo();
                            String Description = value.getDescription();
                            String Date = value.getDate();
                            String MediaURL = value.getMediaURL();
                            String Time = value.getTime();
                            String Address = value.getAddress();

                            final Blog fire = new Blog();
                            fire.setComplaintNo(ComplaintNo);
                            fire.setDescription(Description);
                            fire.setDate(Date);
                            fire.setMediaURL(MediaURL);
                            fire.setTime(Time);
                            fire.setAddress(Address);
                            fire.setComplainee_Name(value.getComplainee_Name());



                           // Read from the database for COMPLAINEE
                           FirebaseDatabase database2 = FirebaseDatabase.getInstance();
                            DatabaseReference myRef2 = database2.getReference("complainee").child(String.valueOf(ComplaintNo));

                            myRef2.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnap) {

                                    Complainee cm = dataSnap.getValue(Complainee.class);

                                    String n = cm.getName();

                                    final Complainee fire2 = new Complainee();
                                    fire2.setName(n);
                                    fire2.setAddress("Address");
                                    list2.add(fire2);


                                }


                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });

                            list.add(fire);
                        }

                    }

                    Personal_RecyclerAdapter recyclerAdapter = new Personal_RecyclerAdapter(list,list2, getContext());
                    RecyclerView.LayoutManager recyce = new GridLayoutManager(getContext(),1);
                    recyclerView.setLayoutManager(recyce);
                    recyclerView.setItemAnimator( new DefaultItemAnimator());
                    recyclerView.setAdapter(recyclerAdapter);


                }catch (Exception e){

                    Toast.makeText(getContext(), "::ERROR   " + e.toString(), Toast.LENGTH_LONG).show();
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

这里是Personal_RecyclerAdapter,我在这里显示列表和列表2列表中的数据显示完美,但列表2中的数据不显示/null

public class Personal_RecyclerAdapter extends RecyclerView.Adapter<Personal_RecyclerAdapter.MyHoder>{



    List<Blog> list;
    List<Complainee> list2;


    Context context;

    public Personal_RecyclerAdapter(List<Blog> list, List<Complainee> list2 , Context context) {
        this.list = list;
        this.list2 = list2;


        this.context = context;
    }



    @Override
    public Personal_RecyclerAdapter.MyHoder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(context).inflate(R.layout.individual_row_personalcomplaint,parent,false);
        Personal_RecyclerAdapter.MyHoder myHoder = new Personal_RecyclerAdapter.MyHoder(view);

        return myHoder;
    }

    @Override
    public void onBindViewHolder(final Personal_RecyclerAdapter.MyHoder holder, final int position) {

        final Blog mylist = list.get(position);
        Complainee mylist2 = list2.get(position);



        holder.Description.setText(mylist.getDescription());
        holder.DateTime.setText(mylist.getDate() + " " + mylist.getTime());

        holder.Complainee.setText(mylist.getComplainee_Name());

        holder.Complainee.setText(mylist2.getName());
        holder.Complain_Address.setText(mylist.getAddress());


        holder.btn_inviteComplainant.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                Intent invitecomplainant = new Intent(context,brgy_inviteComplainant.class);
                invitecomplainant.putExtra("Personal_ComplaintNo", mylist.getComplaintNo());
                context.startActivity(invitecomplainant);
            }
        });


    }


    @Override
    public int getItemCount() {

        int arr = 0;

        try{
            if(list.size()==0){

                arr = 0;

            }
            else{

                arr=list.size();
            }



        }catch (Exception e){



        }

        return arr;

    }

    class MyHoder extends RecyclerView.ViewHolder{
        TextView Description,DateTime, Complain_Address,ComplaintNo, Complainee;
       // ImageView MediaURL;
        RelativeLayout relLyaout;
        Button btn_inviteComplainant;


        public MyHoder(View itemView) {
            super(itemView);
            // ComplaintNo = (TextView) itemView.findViewById(R.id.textView_ComplaintNo);
            Description = (TextView) itemView.findViewById(R.id.complain_description);
            DateTime= (TextView) itemView.findViewById(R.id.complain_datetime);
           // MediaURL= (ImageView) itemView.findViewById(R.id.imageDisplay);

            Complainee = (TextView) itemView.findViewById(R.id.complain_complainee);
            Complain_Address = (TextView) itemView.findViewById(R.id.complain_address);
            btn_inviteComplainant = (Button) itemView.findViewById(R.id.btn_inviteComplainant);


        }
    }
}

共 (3) 个答案

  1. # 1 楼答案

    您正在通过写入myRef = database.getReference("complaints");初始化儿童“投诉”的数据库引用 这就是为什么“投诉”儿童的值为空。 更改您的参考资料,如-

    myRef = database.getReference();

    然后使用

    myRef.child("complainee").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ............
    

    另外呢

    myRef.child("complaints").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ............
    

    希望你的问题能解决

  2. # 2 楼答案

    你所要做的就是这样询问

         FirebaseDatabase mDatabase;
    
         DatabaseReference mDatabaseReference;
    
         List<Complainee> complaineeList=new ArrayList();
    
    
    
            mDatabase = FirebaseDatabase.getInstance();
            mDatabaseReference = mDatabase.getReference();
    
             mdatabaseRef.child("complainee").addValueEventListener(new ValueEventListener() {
          @Override     
          public void onDataChange(DataSnapshot dataSnapshot) {
             for (DataSnapshot childSnapshot: dataSnapshot.getChildren()){
    
                if(complaineeList.size>0){
                 complaineeList.clear();
                 }
    
         Complainee complainee  =  childSnapshot.getValue(Complainee.class );
    
           complaineeList.add(complainee);
    
    
    
    
                 }
    
         Adapter recyclerAdapter = new Adapter(complaineeList, getContext());
    
            }
    
  3. # 3 楼答案

    这是由于firebase侦听器的异步特性造成的,并且您尚未将更改通知适配器。在您的例子中,您正在将项目添加到列表list.add(fire),然后定义了回收器视图。但是您没有等待列表2的数据被添加到list2.add(fire2)

    以下是您的代码的外观:

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("complaints");
        Personal_RecyclerAdapter recyclerAdapter = new Personal_RecyclerAdapter(list,list2, getContext());
        RecyclerView.LayoutManager recyce = new GridLayoutManager(getContext(),1);
        recyclerView.setLayoutManager(recyce);
        recyclerView.setItemAnimator( new DefaultItemAnimator());
        recyclerView.setAdapter(recyclerAdapter);
        list = new ArrayList<Blog>();
        list2 = new ArrayList<Complainee>();
    
        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try{
    
                    for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){
    
                        final Blog value = dataSnapshot1.getValue(Blog.class);
                        Boolean Posted = value.getPosted();
                        String complaint_type = value.getComplaintType();
    
                        if(complaint_type.equals("Personal Complaint")) {
    
                            final int ComplaintNo = value.getComplaintNo();
                            String Description = value.getDescription();
                            String Date = value.getDate();
                            String MediaURL = value.getMediaURL();
                            String Time = value.getTime();
                            String Address = value.getAddress();
    
                            final Blog fire = new Blog();
                            fire.setComplaintNo(ComplaintNo);
                            fire.setDescription(Description);
                            fire.setDate(Date);
                            fire.setMediaURL(MediaURL);
                            fire.setTime(Time);
                            fire.setAddress(Address);
                            fire.setComplainee_Name(value.getComplainee_Name());
    
    
    
                           // Read from the database for COMPLAINEE
                            DatabaseReference myRef2 = database.getReference("complainee").child(String.valueOf(ComplaintNo));
    
                            myRef2.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnap) {
    
                                    Complainee cm = dataSnap.getValue(Complainee.class);
    
                                    String n = cm.getName();
    
                                    final Complainee fire2 = new Complainee();
                                    fire2.setName(n);
                                    fire2.setAddress("Address");
                                    list2.add(fire2);
                                    // Notify to your recyclerview that for the new data
                                    recyclerAdapter.notifyDataSetChanged();
    
                                }
    
    
                                @Override
                                public void onCancelled(DatabaseError databaseError) {
    
                                }
                            });
    
                            list.add(fire);
                            // Notify to your recyclerview that for the new data
                            recyclerAdapter.notifyDataSetChanged();
    
                        }
    
                    }
    
    
    
    
                }catch (Exception e){
    
                    Toast.makeText(getContext(), "::ERROR   " + e.toString(), Toast.LENGTH_LONG).show();
                }
    
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    

    一旦获得数据,就必须通知recyclerview适配器数据集中有一些更改

    希望有帮助