java - Android:无法在 Activity 中显示从 Firebase 检索到的 POJO 到 GridView

标签 java android firebase firebase-realtime-database

简介:我正在尝试构建一个 Android 应用程序来显示有关图书的信息(使用 Google 图书 API)。我最近向该应用程序添加了 firebase。 此时,我可以登录或注册该应用程序,我可以搜索书籍(使用搜索 View ),并且我为从查询创建的 ListView 中列出的每本书添加了一个按钮。我向按钮添加了功能,如下所示它如下:按钮(如果按下)应将当前书籍(在 ListView 中)添加到 FireBase。

我的下一步是检索并显示用户在另一个名为CatalogActivity的 Activity 中添加的所有书籍(BookObjects)

public class CatalogActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_catalog);
  GridView catalogListView = (GridView) findViewById(R.id.CatalogGridList);
  mCatalogActivity = this;
  final List<BookObject> books = new ArrayList<BookObject>();

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = database.getReference();
    databaseReference.child("books").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Iterable<DataSnapshot> children = dataSnapshot.getChildren();
            for (DataSnapshot child : children) {
                BookObject book = child.getValue(BookObject.class);
                books.add(book);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    CatalogAdapter catalogAdapter = new CatalogAdapter(this, books);
    catalogListView.setAdapter(catalogAdapter);

    }
 }

为了更好地理解,这是 Firebase 数据选项卡: enter image description here

(在应用程序中)当我单击CatalogActivity 时, Activity 布局为空( GridView 没有可显示的项目或为空)。

我使用了断点调试,得到了以下结论:

-数据库实例和引用正确获取

-正确获取所有 BookObject 的快照 (dataSnapshot)

-获取所有子快照(child)。

-书籍(本例中为 4 本书)被添加到 books

那为什么书籍不显示?(书籍设置在自定义适配器中,应该显示)

注意:我尝试注释掉 firebase 检索数据代码,并添加了一些硬编码的书籍对象。这些显示正确,因此问题不在于我的自定义适配器。无论如何,我将在下面发布要点以获取更多信息

POJO BookObject 类的要点: BookObject

自定义适配器目录适配器类的要点:CatalogAdapter

非常感谢任何帮助。

最佳答案

您遇到的问题是,您在从 Firebase 提取数据之前设置了 Adapter。要解决此问题,您应该在 onDataChange(DataSnapshot dataSnapshot) 回调中设置适配器。

@Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Iterable<DataSnapshot> children = dataSnapshot.getChildren();
        for (DataSnapshot child : children) {
            BookObject book = child.getValue(BookObject.class);
            books.add(book);
        }
        CatalogAdapter catalogAdapter = new CatalogAdapter(this, books);
        catalogListView.setAdapter(catalogAdapter);
    }

您还可以按照自己的方式设置适配器,即在 Firebase 回调中调用 catalogAdapter.notifyDataSetChanged()

关于java - Android:无法在 Activity 中显示从 Firebase 检索到的 POJO 到 GridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45442582/

相关文章:

java - 生成具有20-25个长度的字符串的唯一随机ID

java - 正则表达式匹配以特定数字开头并以分号结尾的字符串

android - 使用布局充气器填充 gridview

Android - 奇怪的错误或我的文件结构有问题?

java - Java错误尝试在通知中进行更改

android - 有没有办法将消息从 Android 浏览器传递到应用程序?

ios - 首次使用电子邮件登录后强制更新 Firebase 用户个人资料照片

java - 为什么这个 Android 应用程序不能将 Firebase 中的文本转换为字符串?

firebase - 查询Firestore以检查字段值是否存在,并将Stream转换为Future?

java - 将 RGB 颜色转换为 x,y 方向并返回