我有以下代码,可以从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
类中的代码,用于在文本视图中显示字符串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());
在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
}
});
另请参阅:
- getContactsFromFirebase(( 方法返回一个空列表