Android 如何修复列表<&燃气轮机;在OnCreateView()中变为null的
我试图从Firebase实时数据库中检索数据,并将其放在片段中的RecyclerView中的CardView中 但显示的片段为空白白色,没有错误。我在OnCreate方法中检索数据并将其添加到列表中 调试应用程序时,发现即使在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
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本身有疑问时使用,而不是在其中编写任何代码时使用。再见,你好!你试过我上面的方法吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头的左边。应该换成绿色。我会很感激的。谢谢!