我正试图从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;
}
}
我希望列表在
OnCreateView
内不为空,因此片段不会为空 最佳答案
firebaseapi是异步的,这意味着onDataChange()
方法在被调用后立即返回,回调将在稍后被调用。不能保证要花多长时间。因此,在数据可用之前,可能需要几百毫秒到几秒的时间。
因为该方法会立即返回,所以您试图在ibu_val
方法之外使用它的onDataChange()
列表将不会从回调中填充,这就是为什么总是空的原因。
基本上,您尝试从异步的api同步使用变量值。这不是一个好主意,您应该按照预期异步处理api。
快速解决此问题的方法是,在使用以下命令从数据库获取所有元素后通知适配器:
myrv.notifyDatasetChanged();
所以在for循环结束的地方添加这行代码。
如果您打算在回调之外使用该列表,我建议您从post中看到我的anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您还可以查看这个video以获得更好的理解。