Java Android:无法在活动中显示从Firebase检索到GridView的POJO
简介:我正在尝试构建一个android应用程序,它可以显示书籍信息(使用谷歌图书API)。我最近在该应用程序中添加了firebase。 此时,我可以登录或注册到应用程序,我可以搜索书籍(使用搜索视图),并且我已经为通过查询创建的ListView中列出的每本书籍添加了一个按钮。我向按钮添加了如下功能:按钮(如果按下)应将当前书籍(在ListView中)添加到FireBase 我的下一步是检索并显示用户在另一个名为CatalogActivity的活动中添加的所有书籍(BookObjects)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
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检索数据代码,并添加了一些硬编码的图书对象。这些都显示正确,因此问题不在于我的自定义适配器。无论如何,我将发布下面的要点以获取更多信息
POJOBookObject
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){