FirebaseRecyclerAdapter не отображает данные в моем макете RecyclerView - PullRequest
1 голос
/ 18 февраля 2020

Обратите внимание, что таких вопросов много, но у меня ни один из них не сработал. Я пытался отобразить данные в виде рециркулятора, и он не отображает данные и не выдает никаких ошибок. Вот мой код.

Я включил последнюю версию зависимостей Firebase и последнюю версию базы данных пользовательского интерфейса Firebase

Зависимости Версия

// Firebase
implementation 'com.google.firebase:firebase-auth:19.2.0'
implementation 'com.google.firebase:firebase-database:19.2.1'
implementation 'com.google.firebase:firebase-storage:19.1.1'

// Firebase UI
implementation 'com.firebaseui:firebase-ui-database:6.0.2'

Это класс Films Films. java

package com.dipeshpatil.in;

public class Films {

    public String name, year;

    public Films(String name, String year) {
        this.name = name;
        this.year = year;
    }

    public Films() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }
}

Это Класс ViewHolder FilmsViewHolder. java

package com.dipeshpatil.in;

import android.view.View;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

public class FilmsViewHolder extends RecyclerView.ViewHolder {
    public TextView mFilmName;
    public TextView mFilmYear;

    public FilmsViewHolder(View itemView){
        super(itemView);

        mFilmName = itemView.findViewById(R.id.user_single_name);
        mFilmYear = itemView.findViewById(R.id.user_single_status);
    }
}

Это действие, в котором я должен отображать данные в представлении переработчика FilmsActivity. java

public class FilmsActivity extends AppCompatActivity {

    private RecyclerView mFilmsList;
    private DatabaseReference mFilmsDatabase;
    private FirebaseRecyclerOptions<Films> options;
    private FirebaseRecyclerAdapter<Films, FilmsViewHolder> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_films);

        mFilmsList = findViewById(R.id.films_list);
        mFilmsList.setHasFixedSize(true);

        mFilmsDatabase = FirebaseDatabase.getInstance().getReference().child("Films");

        options = new FirebaseRecyclerOptions.Builder<Films>()
                .setQuery(mFilmsDatabase, Films.class)
                .build();

        adapter = new FirebaseRecyclerAdapter<Films, FilmsViewHolder>(options) {
            @Override
            protected void onBindViewHolder(FilmsViewHolder filmsViewHolder, int i, Films films) {

                filmsViewHolder.mFilmName.setText(films.getName());
                filmsViewHolder.mFilmYear.setText(films.getYear());
            }

            @NonNull
            @Override
            public FilmsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

                View mView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.users_single_layout, parent, false);

                return new FilmsViewHolder(mView);
            }
        };
        mFilmsList.setAdapter(adapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

Честно говоря, я не получаю никаких ошибок, которые помогли бы мне отладить код и проверить наличие проблем, и в то же время он также не отображает желаемый результат

База данных Firebase для фильмов

"Films" : {
    "01" : {
      "name" : "The Prestige",
      "year" : 2002
    },
    "02" : {
      "name" : "Fight Club",
      "year" : 1999
    }
}

Файл макета activity_films. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".FilmsActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp"
        android:id="@+id/films_list" />
</LinearLayout>

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

com.google.firebase.database.DatabaseException: не удалось преобразовать значение типа java .lang.Long в строку

Прежде всего, это должно быть InvocationTargetException [ в соответствии с вашей структурой базы данных ], когда вы пытаетесь привести Long к String в вашей модели. Попробуйте обновить модель, как показано ниже:

public class Films {
    public String name;
    public int year;

    ....
}

Затем Вам следует установить LayoutManager на RecyclerView

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mFilmsList.setLayoutManager(linearLayoutManager);

Обновление: Вам необходимо обновить onBindViewHolder для преобразования int в String , прежде чем установить его в TextView , используя String.valueOf

@Override
protected void onBindViewHolder(FilmsViewHolder filmsViewHolder, int i, Films films) {

    filmsViewHolder.mFilmName.setText(films.getName());
    filmsViewHolder.mFilmYear.setText(String.valueOf(films.getYear()));
}
0 голосов
/ 18 февраля 2020

Я думаю, что обычно есть задержка, когда вы получаете ответ от запроса Firebase. Это, вероятно, что происходит. К тому времени, когда вы инициализируете адаптер, список «опций» по-прежнему будет пуст.

...