java.util.ArrayList не может быть приведен к java.util.HashMap Firebase Android - PullRequest
0 голосов
/ 01 октября 2019

Структура моей базы данных:

enter image description here
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'.
Пожалуйста, помогите!
Спасибо за ваше время:)

1 Ответ

1 голос
/ 02 октября 2019

это показывает мне: [null, [null, {rb111 = default}]]. Я не понимаю, почему это происходит

Причина, по которой нужно показать null, вот ваше дерево данных базы данных, некоторые дети - числа. Если вы используете числа в качестве ключей в Firebase DB, он считается массивом.

Если вы используете только 1 в качестве имени kay, это означает, что это второй элемент массива. Firebase считает, что первый элемент массива не определен. Так что это ноль. В [null, [null, {rb111=default}]]. элемент 0 не определен, но определен 1, то есть [null, {rb111=default}]. В этом 0 элемент не определен, но определен 1, то есть {rb111=default}

Я думаю, теперь вы поняли, почему нулевой объект в вашем объекте данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...