2017-11-11 159 views
0

我试图使用addValueEventListener检索Firebase数据,但不幸的是我无法获取正确的数据。 我有New_Deal_List.java类,并在这个类,我想找回'公共类New_Deal_List扩展AppCompatActivity {无法使用addValueEventListener检索Firebase数据

ListView lvDealList; 

List<NewDeal_Database> dealList; 

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("Expert"); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.new__deal__list); 

    lvDealList = (ListView)findViewById(R.id.lvDealList); 
    dealList = new ArrayList<>(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 

    rootRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      dealList.clear(); 
      for(DataSnapshot dealSnapshot : dataSnapshot.getChildren()){ 

       NewDeal_Database info = dealSnapshot.getValue(NewDeal_Database.class); 
       dealList.add(info); 
      } 

      DealList adapter = new DealList(New_Deal_List.this,dealList); 
      lvDealList.setAdapter(adapter); 
     } 


     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Toast.makeText(New_Deal_List.this,"Databse error",Toast.LENGTH_SHORT).show(); 

     } 
    }); 
}  

我用这种方法通过New_Deal.java添加数据

private void AddNewDeal(){ 
    int DealName = Integer.parseInt(etDealName.getText().toString()); 
    String NewDealCategory = etNewDealCategory.getText().toString(); 
    String DishName = etDishName.getText().toString(); 
    String DealDescription = etDealDescription.getText().toString(); 

    if(TextUtils.isEmpty(etDishName.getText().toString()) || TextUtils.isEmpty(etNewDealCategory.getText().toString()) || TextUtils.isEmpty(etDishName.getText().toString()) || TextUtils.isEmpty(etDealDescription.getText().toString())){ 
     Toast.makeText(this,"All fileds must be filled.",Toast.LENGTH_SHORT).show(); 
    }else{ 
     DealId = keyRefrence.push().getKey(); 
     //firebaseDatabase data = new firebaseDatabase(DealName,NewDealCategory,DishName,DealDescription); 

     //Contact_Info info = new Contact_Info(DealName, NewDealCategory, DealDescription); 
     NewDeal_Database info = new NewDeal_Database(DealName,NewDealCategory, DishName, DealDescription);  keyRefrence.child(Cooker_Deal).child(DealId).child(Deal).setValue(info); 

     Toast.makeText(this,"Information Added",Toast.LENGTH_SHORT).show(); 
     Intent intent = new Intent(New_Deal.this,New_Deal_Time.class); 
     startActivity(intent); 
    } 
} 

我使用这种NewDeal_Databse.java

public NewDeal_Database(int DealName,String NewDealCategory, String DishName, String DealDescription){ 
    this.DealName = DealName; 
    this.NewDealCategory = NewDealCategory; 
    this.DishName = DishName; 
    this.DealDescription = DealDescription; 
} 


public int getDealName() { 
    return DealName; 
} 

public String getNewDealCategory() { 
    return NewDealCategory; 
} 

public String getDishName() { 
    return DishName; 
} 

public String getDealDescription() { 
    return DealDescription; 
} 

此外,我DealList.java为阵列适配器

设定值
public class DealList extends ArrayAdapter <NewDeal_Database> { 

    private Activity context; 
    private List<NewDeal_Database> dealList; 

    public DealList(Activity context, List<NewDeal_Database> dealList){ 
     super(context, R.layout.list_layout, dealList); 
     this.context = context; 
     this.dealList = dealList; 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 

     View listViewItem = inflater.inflate(R.layout.list_layout,null,true); 

     TextView tvDealName = (TextView)listViewItem.findViewById(R.id.tvDealNamelayout); 
     TextView tvNewDealCategory = (TextView)listViewItem.findViewById(R.id.tvNewDealCategorylayout); 
     NewDeal_Database info = dealList.get(position); 

     tvDealName.setText(String.valueOf(info.getDealName())); 
     tvNewDealCategory.setText(info.getNewDealCategory()); 

     return listViewItem; 
    } 
} 

我得到这些价值观输出

Output the data

我这是火力DATABSE快照

firebase datasbe snapshot

updated firebase databse snapshot

Updated output

使用此代码

问题解决了:

@Override 
protected void onStart() { 
    super.onStart(); 


    //dealList.clear(); 

    rootRef.child(id).child(Cooker_Deal).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 


      for(DataSnapshot dealSnapshot : dataSnapshot.getChildren()){ 
       for(DataSnapshot datas : dealSnapshot.getChildren()){  // 
        NewDeal_Database info = datas.getValue(NewDeal_Database.class); 
        count++; 
        if(count>3){ 
         dealList.add(info); 
         count=0; 
        } 


       } 
      } 
      DealList adapter = new DealList(New_Deal_List.this,dealList); 
      lvDealList.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 
     } 
+0

您想获得交易信息下的数据吗?你有expertId吗? –

+0

不,我想要New_Deal_List.java类下的数据,是的,我有expertId。 –

+0

New_Deal_List.java类下有4个字段。您需要特定专家的这些值(DealName,NewDealCategory,DishName,DealDescription),这是正确的吗? –

回答

0

我认为它嵌套太多,但要回答你的问题,你需要从你的代码中删除此:

dealList.clear(); 

,并添加它的外addValueEventListener()

这样的:

protected void onStart() { 
super.onStart(); 
    dealList.clear(); 
rootRef.addValueEventListener(new ValueEventListener() { 

编辑:

@Override 
protected void onStart() { 
super.onStart(); 
    dealList.clear(); 
rootRef.child(expertId).child("Cooker Deals").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     for(DataSnapshot dealSnapshot : dataSnapshot.getChildren()){ 
     for(DataSnapshot datas : dealSnapshot.getChildren(){ 
      NewDeal_Database info = datas.getValue(NewDeal_Database.class); 
      dealList.add(info); 



     } 

     DealList adapter = new DealList(New_Deal_List.this,dealList); 
     lvDealList.setAdapter(adapter); 
     adapter.notifydatasetchanged(); 
    } 
+0

没有任何变化。相同的输出。 –

+0

你想dealdescription,dealname ..? –

+0

我想要DealName和NewDealCategory。 –

0

假设faum-expert德纳是你的火力地堡数据库的直接孩子,获得这些数据,请使用如下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference ref = rootRef.child("faum-expert").child("Expert").child(expertId).child("Cooker Deals"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      String dealName = ds.child("Deals Information").child("dealName").getValue(String.class); 
      String newDealCategory = ds.child("Deals Information").child("newDealCategory").getValue(String.class); 
      Log.d("TAG", dealName + "/" + newDealCategory); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
ref.addListenerForSingleValueEvent(eventListener); 

输出将是:

4567/kagj 

但请注意,模型类中的字段首字母大写,数据库中首字母小写。要解决此问题,请在您的字段前添加以下注释,例如:

@PropertyName("dealName") 
private String DealName; 
@PropertyName("newDealCategory") 
private String NewDealCategory; 
@PropertyName("dishName") 
private String DishName; 
@PropertyName("dealDescription") 
private String DealDescription; 
+0

现在工作吗? –

+0

我改变了你说的代码。还要先写小写字母,但是我得到空白屏幕输出。像空屏幕没有值。 –

+0

您可以分享新代码并添加数据库的屏幕截图,包括Firebase根目录。 –