2017-08-01 39 views
0

Intro:我正嘗試構建一個顯示有關圖書信息的Android應用程序(使用Google books API)。我最近嚮應用程序添加了firebase。 在這一刻我可以登錄或註冊到應用程序,我可以搜索圖書(使用搜索視圖),並且我已經爲查詢中創建的ListView中列出的每本圖書添加了一個按鈕。我在按鈕中添加了功能如下所示:按鈕(如果按下)應該將當前書籍(在Listview中)添加到FireBase中。Android:無法在Firebase中向GridView顯示檢索到的POJO活動

我的下一步是檢索和發佈用戶在另一個活動增加的顯示器所有的書(BookObjects)稱爲CatalogActivity

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

    } 
} 

爲了更好地理解這是火力地堡數據標籤: enter image description here

(In app)當我點擊CatalogActivity該活動佈局爲空(gridview沒有要顯示的項目或者它們是空的)。

我已經使用的調試與磨合點,我得到了以下結論:

-database實例和參考得到正確

所有BookObjects的-snapshot正確地獲得(dataSnapshot

-all子快照(child)被獲得。

- 書籍(4本書在這種情況下)被添加到books

那你爲什麼不顯示的書?(書是在自定義適配器套件,並應顯示)

注意我嘗試註釋掉火力retrieveing數據代碼,我增加了一些硬編碼的書對象。這些都是正常顯示等於是問題不與我的自定義Adapter.anyways我會後下面的要點進行任何更多的信息

POJO BookObject的要點類:BookObject

定義適配器Catalogadapter類的要點是:CatalogAdapter

任何幫助,高度讚賞。

回答

1

您遇到的問題是您在設置您的Adapter之前從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); 
    } 

您還可以設置一個適配器,你正在做的方式,火力地堡回調中的調用catalogAdapter.notifyDataSetChanged()

+0

感謝您的幫助。現在它完美地顯示數據。 –

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) { 

    } 
}); 

正如你可能會看到,我提出onDataChange()方法裏面ArrayList的聲明,否則爲null。由於ArrayList只包含onDataChange()中的信息,因此設置適配器也應在那裏進行。

+0

很好的解釋。 Upvoted。謝謝Alex! (再次) –

相關問題