java如何使用Firebase在列表中添加来自不同子级的值?
请帮帮我,我正试图在child("complaints")
和child("complainee")
中获取数据。收集的数据必须存储在列表中。儿童(“投诉”)列表和{list2
是空的。先谢谢你
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);
}
}
}
# 1 楼答案
您正在通过写入
myRef = database.getReference("complaints");
初始化儿童“投诉”的数据库引用 这就是为什么“投诉”儿童的值为空。 更改您的参考资料,如-myRef = database.getReference();
然后使用
另外呢
希望你的问题能解决
# 2 楼答案
你所要做的就是这样询问
# 3 楼答案
这是由于firebase侦听器的异步特性造成的,并且您尚未将更改通知适配器。在您的例子中,您正在将项目添加到列表
list.add(fire)
,然后定义了回收器视图。但是您没有等待列表2的数据被添加到list2.add(fire2)
中以下是您的代码的外观:
一旦获得数据,就必须通知recyclerview适配器数据集中有一些更改
希望有帮助