首页 > 解决方案 > 在文本视图中显示从 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类中。

这是CardRequestAdapterClass 中用于在 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 数据库中获取名称。为什么文本视图中没有显示任何内容?

标签: javaandroidfirebasefirebase-realtime-database

解决方案


数据是从 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    
    }
});

另见:


推荐阅读