Java Android:无法在活动中显示从Firebase检索到GridView的POJO

Java Android:无法在活动中显示从Firebase检索到GridView的POJO,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,简介:我正在尝试构建一个android应用程序,它可以显示书籍信息(使用谷歌图书API)。我最近在该应用程序中添加了firebase。 此时,我可以登录或注册到应用程序,我可以搜索书籍(使用搜索视图),并且我已经为通过查询创建的ListView中列出的每本书籍添加了一个按钮。我向按钮添加了如下功能:按钮(如果按下)应将当前书籍(在ListView中)添加到FireBase 我的下一步是检索并显示用户在另一个名为CatalogActivity的活动中添加的所有书籍(BookObjects) pub

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

我的下一步是检索并显示用户在另一个名为CatalogActivity的活动中添加的所有书籍(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);

    }
 }
公共类CatalogActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_目录);
GridView catalogListView=(GridView)findViewById(R.id.CatalogGridList);
mCatalogActivity=this;
最终图书列表=新的ArrayList();
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference DatabaseReference=database.getReference();
databaseReference.child(“books”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable children=dataSnapshot.getChildren();
for(DataSnapshot子对象:子对象){
BookObject book=child.getValue(BookObject.class);
图书。添加(图书);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
CatalogAdapter CatalogAdapter=新的CatalogAdapter(本,书籍);
setAdapter(catalogAdapter);
}
}
为了更好地理解这一点,请参见Firebase数据选项卡:

(在应用程序中)当我单击CatalogActivity时,活动布局是空的(gridview没有要显示的项目或它们是空的)

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

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

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

-获取所有子快照(
子快照

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

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

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

POJO
BookObject
class的要点:

自定义适配器Catalogadapter类的要点:


非常感谢您的帮助。

您遇到的问题是,在从Firebase获取数据之前,您正在设置
适配器。要解决这个问题,您应该在
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);
    }
@覆盖
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable children=dataSnapshot.getChildren();
for(DataSnapshot子对象:子对象){
BookObject book=child.getValue(BookObject.class);
图书。添加(图书);
}
CatalogAdapter CatalogAdapter=新的CatalogAdapter(本,书籍);
setAdapter(catalogAdapter);
}

您还可以按当前方式设置适配器,在Firebase回调中调用
catalogAdapter.notifyDataSetChanged()

问题是,您在从Firebase获取数据之前设置了
适配器。要解决这个问题,您应该在
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);
    }
@覆盖
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable children=dataSnapshot.getChildren();
for(DataSnapshot子对象:子对象){
BookObject book=child.getValue(BookObject.class);
图书。添加(图书);
}
CatalogAdapter CatalogAdapter=新的CatalogAdapter(本,书籍);
setAdapter(catalogAdapter);
}

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

要解决您的问题,请使用以下代码:

@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);
    }
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference databaseReference = database.getReference();
databaseReference.child("books").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<BookObject> books = new ArrayList<BookObject>();

        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);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference DatabaseReference=database.getReference();
databaseReference.child(“books”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
List books=new ArrayList();
Iterable children=dataSnapshot.getChildren();
for(DataSnapshot子对象:子对象){
BookObject book=child.getValue(BookObject.class);
图书。添加(图书);
}
CatalogAdapter CatalogAdapter=新的CatalogAdapter(本,书籍);
setAdapter(catalogAdapter);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

正如您可能看到的,我已将
ArrayList
的声明移动到
onDataChange()
方法中,因为否则为空。由于
ArrayList
仅包含
onDataChange()
中的信息,因此也应在此处设置适配器。

要解决您的问题,请使用以下代码:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference databaseReference = database.getReference();
databaseReference.child("books").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<BookObject> books = new ArrayList<BookObject>();

        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);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference DatabaseReference=database.getReference();
databaseReference.child(“books”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){