У меня есть 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.
Теперь, это делает работу, но очень неэффективно и может вызвать ошибки, которых я сейчас не вижу.Есть ли лучший способ сделать это?
Заранее спасибо.