Я хочу взять некоторые значения из базы данных (база данных реального времени firebase) и использовать их с некоторыми вычислениями или отобразить их в TextView
, но когда пользователь нажимает кнопку, мое приложение не получает значение до следующего щелчкасо всеми моими методами, с петлей или нет.вне метода onClick()
я могу получить значения просто отлично.Это код для получения данных из базы данных и отображения их в виде TextView
внутри onClick()
DatabaseReference myRef;
private double avgrate;
private String category;
private Button button;
private Spinner categories;
private TextView ratetxt;
protected void onCreate(Bundle savedInstanceState) {
myRef = FirebaseDatabase.getInstance().getReference("user_account");
//initialize
avgrate = 0.0;
button = (Button) findViewById(R.id.button);
ratetxt = (TextView) findViewById(R.id.ratetxt);
ratetxt.setVisibility(View.GONE);
// for category adapter -- it works
myRef.child("(username)").child("category").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<String> propertyAddressList = new ArrayList<String>();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String propertyAddress = ds.getKey();
if (propertyAddress != null) {
propertyAddressList.add(propertyAddress);
for (DataSnapshot ds2 : dataSnapshot.child(propertyAddress).getChildren()) {
String sub = (String) ds2.getValue();
if (sub != null && !sub.contains("null")) {
propertyAddressList.add(sub);
}
}
}
}
categories = (Spinner) findViewById(R.id.categ);
ArrayAdapter<String> addressAdapter = new ArrayAdapter<String>(myactivity.this, android.R.layout.simple_spinner_item, propertyAddressList);
addressAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
categories.setAdapter(addressAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show();
}
});
// ON CLICK
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
category = categories.getSelectedItem().toString();
if (category.isEmpty()) {
Toast.makeText(getApplicationContext(), "ERROR - CHOOSE CATEGORY", Toast.LENGTH_SHORT).show();
} else {
// take average rating -- HERE IS THE PROBLEM
myRef.child("(username)").child("rating").child(category).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String str = (String) dataSnapshot.child("avg").getValue(String.class);
if (str != null) {
avgrate = Double.parseDouble(str);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show();
}
});
ratetxt.setVisibility(View.VISIBLE);
ratetxt.setText("AVG. RATE: "+avgrate+"");
}/*close else*/ }});// End of OnClick()
} // END OF OnCreate()
. Вот код, в котором мне нужно взять средний рейтинг для выбранной категории и установить егов текстовом представлении, при первом нажатии кнопки avg.в следующий раз будет 0.0, и будет установлено реальное значение; если я его не инициализирую, сначала будет установлено null
, затем реальное значение, я не знаю, как это исправить