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

时间:2017-08-01 16:01:07

标签: java android firebase firebase-realtime-database

简介:我正在尝试构建一个显示有关图书信息的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);

    }
 }

为了更好地理解,这是 Firebase数据标签: enter image description here

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

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

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

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

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

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

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

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

POJO BookObject课程的要点:BookObject

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

非常感谢任何帮助。

2 个答案:

答案 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()内的信息,因此也应该在那里设置适配器。