Извлечение данных Firebase из некоторого объекта на основе данных, предоставленных некоторым объектом - PullRequest
0 голосов
/ 19 октября 2019

Database Structure

Я новичок в Android Firebase. У меня есть приложение, в котором я сохранил идентификаторы всех отелей в одном объекте. У меня есть только идентификаторы, поэтому на основании этих идентификаторов я хочу получить всю информацию, которая находится внутри какого-то другого объекта. То, что я пробовал до сих пор

reference=FirebaseDatabase.getInstance().getReference().child(getResources().getString(R.string.all_countries)).child(country).child(city).child("Hotel");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            hotels=new ArrayList<>();
            for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
                String id=dataSnapshot1.getKey();
                hotelIDs.add(id);
                reference1=FirebaseDatabase.getInstance().getReference().child("Hotel").child(id);
                reference1.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        Hotel hotel=dataSnapshot.getValue(Hotel.class);
                        hotels.add(hotel);
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
//            }
            hotelsAdapter=new HotelsAdapterUser(hotels,UserViewHotels.this,"Hotel");
            hotelsRV.setAdapter(hotelsAdapter);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.e("iamhere",databaseError.getMessage());

        }
    });

У меня есть все идентификаторы в списке массивов hotelID, и на основании этого, когда я пытаюсь получить данные, мой адаптер вызывает до того, как список массивов отелей настроен, что означает, что я получаюнет данных. Пожалуйста, помогите

1 Ответ

0 голосов
/ 19 октября 2019

Самое простое решение - просто уведомлять адаптер каждый раз, когда вы добавляете отель в список:

reference1.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Hotel hotel=dataSnapshot.getValue(Hotel.class);
        hotels.add(hotel);
        adapter.notifyDataSetChanged()
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

Я внес еще несколько изменений:

  • ИспользованиеaddListenerForSingleValueEvent, чтобы мы не держали слушателя подключенным. С вашим исходным кодом, если вы изменили отель в базе данных, вторая копия этого отеля будет добавлена ​​в список.
  • Не оставляйте onCancelled пустым, так как вы можете скрыватьсяважные сообщения об ошибках там. Я реализовал это самым простым способом здесь.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...