Структура моей базы данных:
a, b, s - мои названия зданий;1,1,2 - номера этажей;1,1,3 - простые числа, а ra111, rb111, rs231 - мои идентификаторы пользователей. Я пытаюсь реализовать представление списка, отображающее названия зданий, а затем нажимая на любое название здания, представление списка отображает соответствующие номера этажей, а нажатие на номер этажа должно показывать соответствующие номера квартир.
DatabaseReference ref,ref2,ref3;
ListView listBuildings,listFloors,listFlats;
ArrayAdapter<String>adapterBuildings,adapterFloors,adapterFlats;
String[] arrayOfBuildings,arrayOfFloors,arrayOfFlats;
ref = FirebaseDatabase.getInstance().getReference("structure");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
HashMap<String,Object>structure = (HashMap<String, Object>) dataSnapshot.getValue();
Set<String>buildings = structure.keySet();
arrayOfBuildings = buildings.toArray(new String[0]);
adapterBuildings = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1,arrayOfBuildings);
listBuildings.setAdapter(adapterBuildings);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
listBuildings.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
textViewList.setText("Select the floor number");
String building = arrayOfBuildings[position];
Log.i("building",building);
ref2 = FirebaseDatabase.getInstance().getReference("structure").child(building);
listBuildings.setVisibility(View.INVISIBLE);
listFloors.setVisibility(View.VISIBLE);
ref2.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.i("datasnapshot",dataSnapshot.getValue().toString());
Log.i("key",dataSnapshot.getKey());
HashMap<String,Object>structure = (HashMap<String, Object>) dataSnapshot.getValue();
Set<String>floors = structure.keySet();
arrayOfFloors = floors.toArray(new String[0]);
adapterFloors = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1,arrayOfFloors);
listFloors.setAdapter(adapterFloors);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
listFloors.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
textViewList.setText("Select the flat number and press submit");
String floor = arrayOfFloors[position];
Log.i("floor",floor);
ref3 = ref2.child(floor);
listFlats.setVisibility(View.VISIBLE);
listFloors.setVisibility(View.INVISIBLE);
ref3.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.i("datasnapshot",dataSnapshot.getValue().toString());
HashMap<String,Object>f = (HashMap<String, Object>) dataSnapshot.getValue();
Set<String>flats = f.keySet();
arrayOfFlats = flats.toArray(new String[0]);
adapterFlats = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1,arrayOfFlats);
listFlats.setAdapter(adapterFlats);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
Но когда я пытаюсьдля извлечения данных при построении данных: он показывает мне
a
b
s
При нажатии на s отображается правильный этаж:
2
Но если я нажимаю на здании илиздание b:
Это дает мне ошибку: java.util.ArrayList не может быть приведен к java.util.HashMap. Если я записываю значения datasnapShot, он показывает мне: [null, [null, {rb111 = default}]]. Я не понимаю, почему это происходит и почему это правильно работает для построения 's'.
Пожалуйста, помогите!
Спасибо за ваше время:)