在文本视图中显示从 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类中的代码,用于在文本视图中显示字符串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(( 方法返回一个空列表

最新更新