java - 在文本视图中显示从 firebase 数据库恢复的字符串
问题描述
我有这段代码可以从 firebase 数据库中检索我需要的信息:
private void getname(){
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Query lastQuery = ref.child("ride_info").orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()){
String value0_float = ds.child("pickup").child("name").getValue(String.class);
pickupName = String.valueOf(value0_float);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我有这个:
public String getPickupName() {
getname();
String s = String.valueOf(pickupName);
return s;
}
以上所有代码都在RideObject
类中。
这是CardRequestAdapter
Class 中用于在 textview 中显示字符串的代码mPickupName
:
public View getView(int position, View convertView, ViewGroup parent){
RideObject card_item = getItem(position);
if (convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item__card_request, parent, false);
}
TextView mDistance = convertView.findViewById(R.id.distance);
TextView mTime = convertView.findViewById(R.id.time);
CircularProgressBar mProgressBar = convertView.findViewById(R.id.circularProgressBar);
mDistance.setText(card_item.getPickupName());
mTime.setText(card_item.getCalculatedTime() + " min");
final Handler ha=new Handler();
ha.postDelayed(new Runnable() {
@Override
public void run() {
//call function
card_item.setTimePassed(card_item.getTimePassed() + (float)0.5);
mProgressBar.setProgress(card_item.getTimePassed());
if(card_item.getTimePassed() > 100){
items.remove(card_item);
notifyDataSetChanged();
}
ha.postDelayed(this, 50);
}
}, 50);
return convertView;
}
}
我遇到的问题是我无法从 Firebase 数据库中获取名称。为什么文本视图中没有显示任何内容?
解决方案
数据是从 Firebase 异步加载的,因为它可能需要一些时间。如果您设置一些断点或添加一些日志记录,您可能会看到mDistance.setText(card_item.getPickupName());
运行 before pickupName = String.valueOf(value0_float)
,这意味着您在文本视图中设置了一个空字符串。
修复/防止这种情况的规则很简单:任何需要来自数据库的数据的代码都需要在内部onDataChange
或从那里调用。
所以像:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Query lastQuery = ref.child("ride_info").orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()){
String value0_float = ds.child("pickup").child("name").getValue(String.class);
pickupName = String.valueOf(value0_float);
mDistance.setText(pickupName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
另见: