Firebase отображать данные из нескольких ссылок в одном RecyclerView - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть 2 ориентира.Услуги и сервисные типы.Теперь, как вы можете видеть, у servicetypes есть внешний ключ для каждой службы.см. изображение ниже: Здесь

Теперь я хочу установить значение слушателя в обеих точках и прочитать данные и отобразить их в RecyclerView.Каждый сервис имеет несколько типов сервисов.

Я сделал это так:

    database = FirebaseDatabase.getInstance();
    myRef = database.getReference(getString(R.string.services));
    Query userQuery=myRef.child(FireBaseUtils.getFirebaseId());
    userQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            ArrayList<Map<String,String>> temp=new ArrayList<>();

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

      final Service  s=d.getValue(Service.class);
       String id=d.getKey();
         Log.d("TEST", ": "+id);

         serviceTypesReference=database.getReference(getString(R.string.servicetypes)).child(id);
         serviceTypesReference.addListenerForSingleValueEvent(new ValueEventListener() {

             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
                //services.clear();
                 ArrayList<ServiceType> serviceTypes=new ArrayList<>();
                 Service tempService=new Service(s.getName());
                 for(DataSnapshot dd:dataSnapshot.getChildren())
                 {
                     ServiceType st= dd.getValue(ServiceType.class);
                     Log.d("TEST", "typename: "+st.getName());
                     serviceTypes.add(st);
                 }
                 tempService.setServiceTypeArrayList(serviceTypes);

                 services.add(tempService);
                 serviceAdapter=new ServiceAdapter(services);
                 servicesRecyclerView.setAdapter(serviceAdapter);
             }

             @Override
             public void onCancelled(DatabaseError databaseError) {

             }
         });

             }            }

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

    }
});

Здесь объект сервиса содержит имя и ArrayList, содержащий все типы сервисов, которые он включает.Список этих сервисных объектов передается адаптеру RecyclerView.

Теперь, это делает работу, но очень неэффективно и может вызвать ошибки, которых я сейчас не вижу.Есть ли лучший способ сделать это?

Заранее спасибо.

1 Ответ

0 голосов
/ 01 декабря 2018

Я пытаюсь отобразить все службы вместе с количеством типов обслуживания внутри них

Чтобы решить эту проблему, вам нужно дважды выполнить запрос к базе данных.Предполагая, что getString(R.string.services) возвращает service, getString(R.string.servicetypes) возвращает servicetypes и FireBaseUtils.getFirebaseId() содержит этот идентификатор kPBgLQo9WrbhJ01eReOOWbox1Uy1, пожалуйста, следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("services").child("kPBgLQo9WrbhJ01eReOOWbox1Uy1");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String key = ds.getKey();
            String name = ds.child("name").getValue(String.class);

            DatabaseReference keyRef = rootRef.child("servicetypes").child(key);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    long count = dataSnapshot.getChildrenCount();
                    Log.d(TAG, name + "(" + count + ")");
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                }
            };
            keyRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
ref.addListenerForSingleValueEvent(valueEventListener);

Я жестко закодировал имяузлы, чтобы увидеть это более четко.Результат в вашем logcat будет:

Tiffin(3)
Milk(x)
//And so on
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...