2017-08-01 8 views
0

紹介:GoogleブックAPIを使用して書籍に関する情報を表示するアンドロイドアプリを作成しようとしています。 私はログインするか、アプリに登録することができます。検索ビューで書籍を検索することができ、クエリから作成されたListViewにリストされているすべての書籍のボタンを追加しました。次のようにします。ボタンを押すと、現在のブック(リストビュー内)がFireBaseに追加されます。 を取得し、別のアクティビティにユーザーが追加したディスプレイすべての書籍(BookObjects)がより良く理解するためにCatalogActivityAndroid:Firebaseから取得したPOJOをアクティビティのGridViewに表示できません

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

(アプリ内)をクリックした場合のアクティビティカタログアクティビティレイアウトは空です(表示する項目がないか、または空です)。

私がブレークポイントでデバッグを使用していると私は以下の結論になった:

-databaseインスタンスと参照が正しく取得されているすべてのBookObjectsの

-snapshotは(dataSnapshot

正しく得られる

- すべての子スナップショット(child)が得られます。ブックが表示されない理由を

-Books(この場合は4冊)が続い

booksに追加されますか?(図書は、カスタムアダプタに設定されていると表示されるはずです)

私はfirebase retrieveingデータコードをコメントアウトしようと、私はいくつかのハードコードブックオブジェクトを追加しました。これらは非常にため、問題は私のカスタムAdapter.anywaysと私はすべての詳細は下の要旨を掲載する予定されていない正しく表示された

POJO BookObjectの要旨クラス:カスタムアダプタCatalogadapterクラスのBookObject

要旨:CatalogAdapter

非常に助かります。

答えて

1

問題はFirebaseからデータをフェッチする前にAdapterを設定していることです。これを修正するには、アダプタを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); 
    } 

また、アダプタあなたがやっている方法Firebaseコールバック内のinvoke catalogAdapter.notifyDataSetChanged()を設定することができます。あなたはおそらく見たようそうでない場合はnullであるため、私はonDataChange()メソッド内ArrayListの宣言を移動した

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

    } 
}); 

:あなたの問題を解決するために

+0

ありがとうございました。データを完全に表示しています。 –

1

は、このコードを使用してください。 ArrayListにはonDataChange()の情報しか含まれていないため、アダプターの設定もここで行う必要があります。

+0

良い説明。 Upvoted。ありがとう、アレックス! (再び) –

関連する問題