【问题标题】:FirebaseRecyclerAdapter is not displaying data in my RecyclerView layoutFirebaseRecyclerAdapter 未在我的 RecyclerView 布局中显示数据
【发布时间】:2020-02-18 16:08:04
【问题描述】:

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

我已包含最新版本的 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);
    }
}

这是我应该在回收站视图中显示数据的活动 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>

【问题讨论】:

  • 如果您在onCreateViewHolder 和onBindViewHolder 中设置断点并在调试器中运行代码,它会到达这些断点吗?
  • 你在xml中为你的recyclerview设置了layoutmanager吗?
  • @BlueJones 我已经在帖子中添加了布局文件,请检查一次
  • @FrankvanPuffelen 不,我还没有学会使用调试器,所以我对此一无所知
  • 是的,你的 recyclerview 中缺少布局管理器,可以添加 xml app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 或按照 Md. Asaduzzaman 如下所述以编程方式添加

标签: java android firebase firebase-realtime-database firebaseui


【解决方案1】:

com.google.firebase.database.DatabaseException:转换失败 java.lang.Long 类型的值到 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,然后再使用String.valueOf 将其设置为TextView

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

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

【讨论】:

  • 我按照你说的做了更改,现在它抛出错误,应用程序崩溃这是我得到E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dipeshpatil.in, PID: 1880 android.content.res.Resources$NotFoundException: String resource ID #0x7d2 at android.content.res.Resources.getText(Resources.java:363) at android.widget.TextView.setText(TextView.java:6484) at com.dipeshpatil.in.FilmsActivity$1.onBindViewHolder(FilmsActivity.java:46) at com.dipeshpatil.in.FilmsActivity$1.onBindViewHolder(FilmsActivity.java:41) 的错误
  • 在onBindViewHolder内使用String.valueOf(films.getYear())
  • 谢谢你终于成功了!它需要一个 layoutManager
【解决方案2】:

我认为当您从 Firebase 查询中获得响应时,通常会有延迟。大概就是这么回事。当您初始化适配器时,“选项”列表仍然是空的。

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

【讨论】:

  • FirebaseRecyclerAdapter 负责异步加载,并在数据可用/更改时调用notifyDataSetChanged。
  • 哦,好的,谢谢您的澄清。我的印象是你必须自己管理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多