FirebaseRecyclerAdapter 未在我的 RecyclerView 布局中显示数据
FirebaseRecyclerAdapter is not displaying data in my RecyclerView layout
请注意有很多这样的问题,但其中 none 对我有用。
我一直在尝试在回收站视图中显示数据,但它没有显示数据,也没有抛出任何错误
这是我的代码。
我已经包含了最新版本的 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'
这是电影class
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 Class 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);
}
}
这是我应该在回收站视图中显示数据的 activity 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>
com.google.firebase.database.DatabaseException: Failed to convert
value of type java.lang.Long to String
首先, 它应该是 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()));
}
我认为从 Firebase 查询得到响应通常会有延迟。这可能就是正在发生的事情。当您初始化适配器时,"options" 列表仍然是空的。
您很可能需要使用线程同步来执行此操作。
请注意有很多这样的问题,但其中 none 对我有用。 我一直在尝试在回收站视图中显示数据,但它没有显示数据,也没有抛出任何错误 这是我的代码。
我已经包含了最新版本的 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'
这是电影class 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 Class 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);
}
}
这是我应该在回收站视图中显示数据的 activity 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>
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
首先, 它应该是 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()));
}
我认为从 Firebase 查询得到响应通常会有延迟。这可能就是正在发生的事情。当您初始化适配器时,"options" 列表仍然是空的。
您很可能需要使用线程同步来执行此操作。