java - 我在 onclick() 中的值直到下次单击才会显示
问题描述
我想从数据库(firebase实时数据库)中获取一些值并将其用于一些计算或将其显示在a中,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
先设置然后真实值,我不知道如何修复它
解决方案
在 button.setOnClickListener() 的 onDataChange() 里面添加这些行,而不是在 onDataChange() 外面写
ratetxt.setVisibility(View.VISIBLE);
ratetxt.setText("AVG. RATE: "+avgrate+"");
以下是更改后的代码。希望这有帮助。
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);
ratetxt.setVisibility(View.VISIBLE);
ratetxt.setText("AVG. RATE: "+avgrate+"");
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show();
}
});