简介:我正在尝试构建一个显示有关图书信息的Android应用程序(使用Google图书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时,活动布局为空(gridview没有要显示的项目或它们是空的。)
我使用了断点调试,我得出以下结论:
- 正确获取数据库实例和引用
- 正确获取所有BookObjects的快照(dataSnapshot
)
- 获得所有子快照(child
)。
-Books(本例中为4本书)被添加到books
那么为什么不显示这些书?(这些书籍是在自定义适配器中设置的,应该显示)
注意:我尝试注释了firebase检索数据代码,并添加了一些硬编码的图书对象。那些显示正确,因此问题不在于我的自定义Adapter.anyways我将发布下面的要点以获取更多信息
POJO BookObject
课程的要点:BookObject
自定义适配器Catalogadapter类的要点:CatalogAdapter
非常感谢任何帮助。
答案 0 :(得分:1)
您遇到的问题是,您在从Firebase获取数据之前设置了sc.broadcast(h) and h.value
。要解决此问题,您应该在Adapter
回调中设置适配器。
onDataChange(DataSnapshot dataSnapshot)
您也可以按照自己的方式设置适配器,在Firebase回调中调用@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);
}
。
答案 1 :(得分:1)
要解决您的问题,请使用以下代码:
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) {
}
});
正如您可能看到的那样,我已在ArrayList
方法中移动了onDataChange()
的声明,因为否则为null。由于ArrayList
确实只包含onDataChange()
内的信息,因此也应该在那里设置适配器。