如何修复在 OnCreateView() 中变为 null 的 List<>

Posted

技术标签:

【中文标题】如何修复在 OnCreateView() 中变为 null 的 List<>【英文标题】:How to fix a List<> that become null inside OnCreateView() 【发布时间】:2019-08-31 20:35:36 【问题描述】:

我正在尝试从 Firebase 实时数据库中检索数据并将其放在片段内的 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,因此 Fragment 不会为空

【问题讨论】:

欢迎来到 Stack Overflow。请不要仅仅因为您使用该 IDE 而使用 IDE 标签 (android-studio) 来标记问题:这些标签仅应在您对 IDE 本身有疑问时使用,而不是您在其中编写的任何代码。见when is it appropriate to remove an IDE tag 【参考方案1】:

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

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

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

此问题的快速解决方法是在您从数据库中获取所有元素后通知适配器:

myrv.notifyDatasetChanged();

所以在 for 循环结束的地方添加这行代码。

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

【讨论】:

以上是关于如何修复在 OnCreateView() 中变为 null 的 List<>的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“在 Qt 中将两个定时器变为一个函数,使用 qmutex 将 qeventloop 进行睡眠”

如何修复此绘图程序,以便在选择另一个像素时,从一条线绘制的最后一个像素不会变为不同的颜色?

如何防止在android片段中按下后退按钮时调用onCreateView

硬盘变为raw是怎么回事?

完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?

如何防止片段在活动重新创建时触发 onCreate onCreateView