I want to create a products menu using RecyclerView
with image, name, price and ingredients. For retrieving the image, name and price I used one database reference and another one for ingredients. However, when I am trying to get the variable from one onDataChange
and use it in the first one (meaning outside the second onDataChange
method) it returns null for ingredients.
final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("MENIU");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot menu: dataSnapshot.getChildren()) {
String key = menu.getKey();
String category = (String) dataSnapshot.child(key).child("CATEGORIE").getValue();
Toast.makeText(getApplicationContext(), category, Toast.LENGTH_SHORT).show();
if (categ.equals(category)) {
nameObj = (String) dataSnapshot.child(key).child("NUME_PRODUS").getValue();
priceObj = String.valueOf(dataSnapshot.child(key).child("PRET_PRODUS").getValue());
imageObj = dataSnapshot.child(key).child("IMAGINE").getValue(String.class);
Toast.makeText(getApplicationContext(), nameObj + priceObj + imageObj, Toast.LENGTH_SHORT).show();
final DatabaseReference ingr = FirebaseDatabase.getInstance().getReference().child("MENIU/" + key + "/INGREDIENTE");
ingr.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String keys = " ";
int i = 0;
int nr = 0;
for (DataSnapshot ingredients: dataSnapshot.getChildren()) {
keys = ingredients.getKey();
ingredientObj = (String) dataSnapshot.child(keys).child("DENUMIRE").getValue();
nr++;
list[i++] = ingredientObj;
}
String[] ingredients = new String[nr];
for (int j = 0; j < nr; j++)
ingredients[j] = list[j];
menuObject.add(new MenuObject(imageObj, nameObj, ingredients, priceObj, R.drawable.plus, "0", R.drawable.minus, R.drawable.button_buy));
menuAdapter = new MenuAdapter(menuObject);
noodlesEn.setLayoutManager(layoutManager);
noodlesEn.setAdapter(menuAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
How can I use the list variable outside the onChange
method (to have access not only for nameObj
, priceObj
, imageObj
, but for ingredients too)? I have watched some videos and another stackoverflow posts, but all have the same solution from one guy only and I didn't understand how it should look for me.
EDIT
final DatabaseReference ingr = FirebaseDatabase.getInstance().getReference().child("MENIU/" + key + "/INGREDIENTE");
ingr.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
readData(new FirebaseCallback() {
@Override
public void onCallback(String image, String name, String price) {
String keys=" ";
int i = 0; int nr = 0;
for(DataSnapshot ingredients: dataSnapshot.getChildren()) {
keys = ingredients.getKey();
ingredientObj = (String) dataSnapshot.child(keys).child("DENUMIRE").getValue();
nr++;
list[i++] = ingredientObj;
Toast.makeText(getApplicationContext(), ingredientObj+ " ", Toast.LENGTH_SHORT).show();
}
String[] ingredients = new String[nr];
for(int j = 0; j< nr; j++) {
ingredients[j] = list[j];
}
menuObject.add(new MenuObject(image, name, ingredients, price, R.drawable.plus, "0", R.drawable.minus, R.drawable.button_buy));
Toast.makeText(getApplicationContext(),image + name + price, Toast.LENGTH_SHORT).show();
menuAdapter = new MenuAdapter(menuObject);
noodlesEn.setLayoutManager(layoutManager);
noodlesEn.setAdapter(menuAdapter);
}
});
}
private void readData(final FirebaseCallback firebaseCallback){
final String categ = title.getText().toString();
final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("MENIU");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot menu: dataSnapshot.getChildren()) {
key = menu.getKey();
String category = (String) dataSnapshot.child(key).child("CATEGORIE").getValue();
// Toast.makeText(getApplicationContext(), category, Toast.LENGTH_SHORT).show();
if (categ.equals(category)) {
nameObj = (String) dataSnapshot.child(key).child("NUME_PRODUS").getValue();
priceObj = String.valueOf(dataSnapshot.child(key).child("PRET_PRODUS").getValue());
imageObj = dataSnapshot.child(key).child("IMAGINE").getValue(String.class);
firebaseCallback.onCallback(imageObj, nameObj, priceObj);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
ref.addListenerForSingleValueEvent(valueEventListener);
}
private interface FirebaseCallback {
void onCallback(String image, String name, String price);
}