Список массивов становится пустым после метода прослушивания addListenerForSingleValueEvent - PullRequest
1 голос
/ 25 июня 2019

Я извлекаю данные из базы данных Firebase в обзор переработчика. Я не могу получить данные в RecyclerViewAdapter, так как список Array становится пустым после метода addListenerForSingleValueEvent.

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
        database = FirebaseDatabase.getInstance();
        ArrayList<Item> arr = new ArrayList<Item>();


        DatabaseReference reference = database.getReference("NoticeBoard");

        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

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

                    String text1 = (String) singleSnapshot.child("Text1").getValue();
                    String text2 = (String) singleSnapshot.child("Text2").getValue();

                    arr.add(new Item(text1, text2));
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

        RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), arr);// Here the ArrayList arr is empty

        RecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);

        return view;
    }

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вызовы базы данных Firebase не являются асинхронными, что означает, что строки ниже запроса будут выполнены до того, как вы получите ответ от firebase.

Поэтому обновите ваш код, как показано ниже, чтобы он работал как положено.

 RecyclerViewAdapter adapter;

 @Override
 public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_dashboard, container, false);
    database = FirebaseDatabase.getInstance();
    ArrayList<Item> arr = new ArrayList<Item>();

    adapter = new RecyclerViewAdapter(getContext(), arr);// Here the ArrayList arr is empty

    RecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);

    DatabaseReference reference = database.getReference("NoticeBoard");

    reference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

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

                String text1 = (String) singleSnapshot.child("Text1").getValue();
                String text2 = (String) singleSnapshot.child("Text2").getValue();

                arr.add(new Item(text1, text2));
            }
            if(adapter != null){
               adapter.notifyDataSetChanged();
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });

    return view;
}

Примечания: Рекомендуется устанавливать данные после того, как представление было создано во фрагментах. Для этого вы можете использовать onViewCreated() метод фрагмента.

1 голос
/ 25 июня 2019

onDataChange() является асинхронным, поэтому, так как вы вызываете arraylist после addListenerForSingleValueEvent, он вернет пустой список, поскольку данные еще не получены.

Чтобы решить вашу проблему, вам нужно добавитьarrayList inside onDatachange():

        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

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

                    String text1 = (String) singleSnapshot.child("Text1").getValue();
                    String text2 = (String) singleSnapshot.child("Text2").getValue();
                    ArrayList<Item> arr = new ArrayList<Item>();
                    arr.add(new Item(text1, text2));

                    RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), arr);
                    RecyclerView recyclerView = view.findViewById(R.id.dashboardRecyclerView);

                    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                    recyclerView.setAdapter(adapter);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...