Android 如何修复列表<&燃气轮机;在OnCreateView()中变为null的

Android 如何修复列表<&燃气轮机;在OnCreateView()中变为null的,android,firebase,android-fragments,firebase-realtime-database,Android,Firebase,Android Fragments,Firebase Realtime Database,我试图从Firebase实时数据库中检索数据,并将其放在片段中的RecyclerView中的CardView中 但显示的片段为空白白色,没有错误。我在OnCreate方法中检索数据并将其添加到列表中 调试应用程序时,发现即使在onCreate方法中分配了检索到的数据,该列表在onCreateView方法中仍然为空 片段仪表板列表类: public class fragment_dashboard_list extends Fragment { List<ibu> ibu_i

我试图从Firebase实时数据库中检索数据,并将其放在片段中的RecyclerView中的CardView中

但显示的片段为空白白色,没有错误。我在OnCreate方法中检索数据并将其添加到列表中

调试应用程序时,发现即使在
onCreate
方法中分配了检索到的数据,该列表在
onCreateView
方法中仍然为空

片段仪表板列表类:

public class fragment_dashboard_list extends Fragment {

    List<ibu> ibu_ibu;
    FirebaseDatabase database;
    DatabaseReference myRef ;
    String a;

    public fragment_dashboard_list() {}
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ibu_ibu = new ArrayList<>();

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("Guardian");

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.

                for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){

                    ibu value = dataSnapshot1.getValue(ibu.class);
                    ibu ibu_val = new ibu();

                    String alamat = value.getAlamat();
                    String foto = value.getFoto();
                    String hp = value.getHp();
                    String ktp = value.getKtp();
                    String nama = value.getNama();
                    String privilege = value.getPrivilege();
                    String ttl = value.getTtl();

                    ibu_val.setAlamat(alamat);
                    ibu_val.setFoto(foto);
                    ibu_val.setHp(hp);
                    ibu_val.setKtp(ktp);
                    ibu_val.setNama(nama);
                    ibu_val.setPrivilege(privilege);
                    ibu_val.setTtl(ttl);

                    // Here the List ibu_ibu is not NULL
                    ibu_ibu.add(ibu_val);
                }
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w("Hello", "Failed to read value.", error.toException());
            }
        });
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
       Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_dashboard_list, container, false);

        RecyclerView myrv = (RecyclerView) view.findViewById(R.id.dashboard_recycler_view);

        //Here the List ibu_ibu is null
        adapter_list_ibu myAdapter = new adapter_list_ibu(ibu_ibu);
        LinearLayoutManager LinearLayoutManager = new LinearLayoutManager(getContext());
        myrv.setLayoutManager(LinearLayoutManager);
        myrv.setAdapter(myAdapter);
        return view;
    }
}
public class fragment\u dashboard\u列表扩展了fragment{
列出ibu_ibu;
Firebase数据库;
数据库参考myRef;
字符串a;
公共片段\u仪表板\u列表(){}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ibu_ibu=新阵列列表();
database=FirebaseDatabase.getInstance();
myRef=database.getReference(“监护人”);
myRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
//使用初始值调用此方法一次,然后再次调用
//每当更新此位置的数据时。
对于(DataSnapshot dataSnapshot1:DataSnapshot.getChildren()){
ibu值=dataSnapshot1.getValue(ibu.class);
ibu ibu_val=新的ibu();
字符串alamat=value.getAlamat();
字符串foto=value.getFoto();
字符串hp=value.getHp();
字符串ktp=value.getKtp();
字符串nama=value.getNama();
String privilege=value.getPrivilege();
字符串ttl=value.getTtl();
ibu_val.setAlamat(阿拉马特);
ibu_val.setFoto(foto);
ibu_val.setHp(hp);
ibu_val.setKtp(ktp);
ibu_val.setNama(纳米);
ibu_val.setPrivilege(特权);
ibu_val.setTtl(ttl);
//此处列表ibu_ibu不为空
ibu_ibu.add(ibu_val);
}
}
@凌驾
已取消的公共无效(DatabaseError错误){
//无法读取值
Log.w(“Hello”,“读取值失败”,error.toException());
}
});
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u仪表板\u列表,容器,错误);
RecyclerView myrv=(RecyclerView)视图.findViewById(R.id.dashboard\u recycler\u视图);
//此处列表ibu_ibu为空
适配器\u列表\u ibu myAdapter=新适配器\u列表\u ibu(ibu\u ibu);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getContext());
myrv.setLayoutManager(线性布局经理);
myrv.setAdapter(myAdapter);
返回视图;
}
}

我希望列表在
OnCreateView
中不为空,因此片段不会为空

Firebase API是异步的,这意味着
onDataChange()
方法在调用后立即返回,回调将在稍后调用。无法保证需要多长时间。因此,在数据可用之前,可能需要几百毫秒到几秒钟的时间

由于该方法会立即返回,因此您试图在
onDataChange()
方法之外使用它的
ibu_val
列表将不会从回调中填充,这就是为什么始终为空

基本上,您尝试从异步API同步使用变量值。这不是一个好主意,您应该按照预期异步处理API

此问题的一个快速解决方案是,在从数据库中获取所有元素后,使用以下命令通知适配器:

myrv.notifyDatasetChanged();
因此,在for循环结束后添加这行代码


如果您打算在回调之外使用该列表,我建议您查看此中我的anwser的最后一部分,其中我已解释了如何使用自定义回调来完成此操作。您还可以查看此以更好地理解。

欢迎使用堆栈溢出。请不要仅仅因为您使用了IDE就用IDE标签(android studio)来标记问题:这些标签只应该在您对IDE本身有疑问时使用,而不是在其中编写任何代码时使用。再见,你好!你试过我上面的方法吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头的左边。应该换成绿色。我会很感激的。谢谢!