首页 > 解决方案 > 为什么不能从firebase扫描数据

问题描述

我在 onStart 方法中从 firebase 获取数据并将它们放入 Arraylist(user_words) 中。但在 onCreateView 方法中,我的 Arraylist 看起来是空的。但是在 onstart 中,arraylist 看起来很满。我在不同的班级做过同样的事情,而且效果很好。但这一次失败了。我不明白我的错是什么?

private DatabaseReference databaseReference2 = FirebaseDatabase.getInstance().getReference("kullanici_kelime");

    private ArrayList<User_word> user_words= new ArrayList<>();

    @Override
    public void onStart(){
        super.onStart();

        databaseReference2.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                user_words.clear();

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

                    User_word user_word= new User_word();
                    user_word.setMean(postSnapshot.child("mean").getValue(String.class)) ;
                    user_word.setName(postSnapshot.child("name").getValue(String.class));
                    user_word.setKey(postSnapshot.child("key").getValue(String.class));
                    user_word.setKey(postSnapshot.child("id").getValue(String.class));

                    user_words.add(user_word);
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view =inflater.inflate(R.layout.fragment_frag3, container,false);

        rv= (RecyclerView)view.findViewById(R.id.rv2);
        rv.setHasFixedSize(true);
        rv.setLayoutManager(new LinearLayoutManager(this.getActivity()));

        Log.e("wordssize",Integer.toString(user_words.size()));
        adapter= new CardAdapter2_2(getActivity(),user_words);
        rv.setAdapter(adapter);

        return view;
    }

数据库结构

标签: javaandroidfirebasefirebase-realtime-database

解决方案


addValueEventListener是异步的,并在数据库查询完成之前立即返回。只要数据可用,您传递给它的回调将在一段时间后调用。在填充数据之前,您不应该尝试使用该数组,这意味着您应该只更新活动的 UI,直到最终调用该回调。


推荐阅读