Java FirebaseRecyclerAdapter未在我的RecyclerView布局中显示数据

Java FirebaseRecyclerAdapter未在我的RecyclerView布局中显示数据,java,android,firebase,firebase-realtime-database,firebaseui,Java,Android,Firebase,Firebase Realtime Database,Firebaseui,请注意,有很多这样的问题,但没有一个适合我。 我一直试图在回收器视图中显示数据,但它没有显示数据,也没有抛出任何错误 这是我的密码 我已经包括了最新版本的Firebase依赖项和最新版本的Firebase UI数据库 依赖项版本 // Firebase implementation 'com.google.firebase:firebase-auth:19.2.0' implementation 'com.google.firebase:firebase-database:19.2.1' imp

请注意,有很多这样的问题,但没有一个适合我。 我一直试图在回收器视图中显示数据,但它没有显示数据,也没有抛出任何错误 这是我的密码

我已经包括了最新版本的Firebase依赖项和最新版本的Firebase UI数据库

依赖项版本

// 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.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);
    }
}
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();
    }
}
这是我应该在回收器视图中显示数据的活动FilmsActivity.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);
    }
}
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();
    }
}
布局文件活动\u 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>

com.google.firebase.database.DatabaseException:转换失败 java.lang.Long类型的值转换为字符串

首先,它应该是一个
InvocationTargetException
[根据您的数据库结构,]当您尝试在模型中将
转换为
字符串时。尝试更新您的模型,如下所示:

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

    ....
}
然后,您应该将
LayoutManager
设置为您的
RecyclerView

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mFilmsList.setLayoutManager(linearLayoutManager);
更新:在使用
String.valueOf将
int
设置为TextView之前,您必须更新您的
onBindViewHolder
以将
int
转换为String

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

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

我认为当您从Firebase查询中得到响应时,通常会出现延迟。这可能就是正在发生的事情。初始化适配器时,“选项”列表仍然为空


您很可能需要使用线程同步来完成此操作。

如果在
onCreateViewHolder
onBindViewHolder
中设置断点并在调试器中运行代码,它到达那些断点了吗?你为你的recyclerview设置了xml布局管理器了吗?@BlueJones我已经在帖子中添加了布局文件,现在请检查一下once@FrankvanPuffelen不,我还没有学会使用调试器,所以我一点也不知道。是的,你的回收视图中缺少布局管理器,可以添加xml
app:layoutManager=“androidx.recyclerview.widget.LinearLayoutManager”
或按Md.Asaduzzaman在下面所述的编程方式。我做了如您所说的更改,现在正在抛出错误,应用程序正在崩溃。这是我收到的错误
E/AndroidRuntime:FATAL EXCEPTION:main Process:com.dipeshpatil.in,PID:1880 android.content.res.Resources$NotFoundException:String resource ID#0x7d2位于android.content.res.Resources.getText(Resources.java:363)位于android.widget.TextView.setText(TextView.java:6484)位于com.dipeshpatil.in.FilmsActivity$1.onBindViewHolder(FilmsActivity.java:46)在com.dipeshpatil.in.FilmsActivity$1.onBindViewHolder(FilmsActivity.java:41)
使用
String.valueOf(films.getYear())
inside
onBindViewHolder
谢谢你,它终于成功了!它需要一个布局管理器
FirebaseRecyclerAdapter
负责异步加载,并在数据可用/更改时调用
notifyDataSetChanged
。哦,好的,谢谢您的澄清。我的印象是你必须自己处理!