Firebase - отображение в ListView - PullRequest
0 голосов
/ 14 июля 2020

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

База данных Firebase

Как он сейчас отображается

Загрузить в Firebase

String filmID = filmDetails.getString("film_id");
String filmName = filmDetails.getString("film_name");
DatabaseReference currentUserDBR = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);

if (currentUserID != null) {

currentUserDBR.orderByChild(filmID).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        String fbFilmID = snapshot.getValue().toString();
        if (fbFilmID.contains(filmID)) { // If film already exists Remove it on click
            btnSaved.setText("Add to List");
            currentUserDBR.child(filmID).removeValue();
            Toast.makeText(getApplicationContext(), "Removed from Films List", Toast.LENGTH_SHORT).show();
        } else { // If film does not exist add it on click
            btnSaved.setText("Remove");
            currentUserDBR.child(filmID).child("Film Name").setValue(filmName);
            Toast.makeText(getApplicationContext(), "Saved to Films List", Toast.LENGTH_SHORT).show();
            overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
        }
    }

Показать в ListView

DatabaseReference filmsReference = FirebaseDatabase.getInstance().getReference( "Users");
lvSavedFilms = findViewById(R.id.lv_display_saved_films);
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, R.layout.listitem, R.id.lv_text_color, filmName);
lvSavedFilms.setAdapter(arrayAdapter);

ChildEventListener childEventListener = filmsReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
/*                GenericTypeIndicator<HashMap<String, Object>> genericTypeIndicator = new GenericTypeIndicator<HashMap<String, Object>>() {
                };
                HashMap<String, Object> hmFilmName = snapshot.getValue(genericTypeIndicator);*/
                String value = snapshot.getValue().toString();
                filmName.add(value);

                arrayAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {
                arrayAdapter.remove(arrayAdapter.getItem(filmName.indexOf(snapshot.getValue(String.class))));
                arrayAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

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

            }

        });

Я пробовал String value = snapshot.getValue(String.class);, но получил ошибка о том, что не удалось преобразовать HashMap в String.

1 Ответ

0 голосов
/ 14 июля 2020

Поскольку filmsReference указывает на узел Users в вашей базе данных, snapshot, который вы получаете в onChildAdded, содержит все данные для узла nfx....

Чтобы перейти к фактическому film, вы должны l oop поверх дочерних узлов `snapshot:

filmsReference.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
        for (DataSnapshot filmSnapshot: snapshot.getChildren()) {
            String value = filmSnapshot.child("Film Name").getValue(String.class);
            filmName.add(value);
        }
...