почему нельзя сканировать данные из firebase - PullRequest
0 голосов
/ 05 марта 2020

Я получаю данные из firebase в методе onStart и помещаю их в Arraylist (user_words). Но в методе onCreateView мой Arraylist выглядит пустым. Однако в самом начале 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;
    }

структура базы данных

1 Ответ

0 голосов
/ 05 марта 2020

addValueEventListener является асинхронным и немедленно возвращается до завершения запроса к базе данных. Обратный вызов, который вы передаете ему, будет вызван через некоторое время, когда будут доступны данные. Вы не должны пытаться использовать массив до тех пор, пока эти данные не будут заполнены, а это означает, что вы должны только обновлять пользовательский интерфейс своей активности, пока этот обратный вызов не будет окончательно вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...