如何修复在OnCreateView()

时间:2019-04-10 11:39:11

标签: android firebase android-fragments firebase-realtime-database

我正在尝试从Firebase实时数据库中检索数据,并将其放在Fragment内RecyclerView内的CardView上。

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

在调试应用程序时,发现即使在onCreate方法内分配了检索到的数据后,列表仍在onCreateView方法内为NULL。

片段仪表板列表类:

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中的List不能为NULL,因此片段不会为空

1 个答案:

答案 0 :(得分:1)

Firebase API是异步的,这意味着onDataChange()方法在被调用后立即返回,并且回调将在一段时间后被调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。

由于该方法会立即返回,因此您尚未在ibu_val方法之外使用的onDataChange()列表中,尚未从回调中填充该列表,因此始终为空。 / p>

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

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

myrv.notifyDatasetChanged();

因此,在for循环结束处之后添加这一行代码。

如果您打算在回调之外使用该列表,建议您从 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调。您也可以查看此 video 以获得更好的理解。