2017-02-03 2 views
2

私はこのようになります非常に単純なFirebaseデータベースがあります。これは私のモデルである enter image description hereAndroidでFirebaseListAdapterを使用してListView内のFirebaseデータベースからアイテムの正確な数を表示するにはどうすればいいですか?

を:

public class ShoppingListModel { 
    private String shoppingListName; 
    private Map<String, String> usersMap; 

    public ShoppingListModel() {} 

    public void setShoppingListName(String shoppingListName) {this.shoppingListName = shoppingListName;} 
    public String getShoppingListName() {return shoppingListName;} 

    public void setUsersMap(Map<String, String> usersMap) {this.usersMap = usersMap;} 
    public Map<String, String> getUsersMap() {return usersMap;} 
} 

私がやりたいすべてが、所属ListViewのみリストに表示することです単一のユーザーであり、値はtrueです。このコードでは、

Query query = databaseReference.child("ShoppingLists").orderByChild("shoppingListName"); 
firebaseListAdapter = new FirebaseListAdapter<ShoppingListModel>(this, ShoppingListModel.class, android.R.layout.simple_list_item_1, query) { 
     @Override 
     protected void populateView(View v, ShoppingListModel slm, int position) { 
      for (Map.Entry<String, String> entry : slm.getUsersMap().entrySet()) { 
       String key = entry.getKey(); 
       String value = entry.getValue(); 
       if (key.equals("[email protected],com") && value.equals("true")) { 
        ((TextView)v.findViewById(android.R.id.text1)).setText(slm.getShoppingListName()); 
       } 
      } 
     } 
    }; 
    ListView listView = (ListView) findViewById(R.id.list_view); 
    listView.setAdapter(firebaseListAdapter); 

次の図のように空のビューが表示されます。

enter image description here

はどうすれば正しくListView内の項目を表示することができますか?

答えて

2

あなたは質問でそれを指定していませんが、あなたのアプリが多数のユーザーが1つのリストを使用できるショッピングリストであると仮定しています。

データベースを再構成してクエリを簡略化することをお勧めします。各ユーザーのリスト名とIDを格納するノードをもう1つ追加します。

"userLists" : { 
    "[email protected]" : { 
     "-Kbvasnd23sdj" : "bbb", 
     "-Kbvasndaisdj" : "aaa", 
     "-Kbvasxzvisdj" : "ddd" 
    }, 
    "[email protected]" : { 
     "-Kbvasndaisxz" : "ccc" 
    } 
    } 

この方法で、特定のユーザーからのすべてのリストを取得したいとき、あなたが使用したい:このような

Query query = FirebaseDatabase.getInstance().getReference().child("userLists/[email protected]"); 

そして、あなたは明らかにユーザーに能力を与えたいと思いますアイテムをクリックしてリストを表示する。 userListsの各ノードのプッシュIDがShoppingListsノードのIDと同じであることを確認することで、これを行うことができます。

要約:リストを表示しているときに、userListsノードからデータを読み込みます。リストの詳細を表示するときは、ShoppingListsノードからデータを読み取ります。 Firebaseでデータベースを作成するときに覚えておく必要があることは、次のとおりです。

ビューの後でデータを構造化します。

彼のやり方の詳細については、Firebase Database for SQL Developers seriesをご覧ください。

+0

はい、とてもうまく機能しました。ありがとうございました! –

3

コードにqueryの内容が表示されていないので、それはすべての場合のDatabaseReferenceであると仮定しています(/ShoppingLists)。あなたがそれをしているなら、あなたはその場所のすべての子供のためにpopulateViewを呼び出すでしょう。つまり、あなたはすべての子であるのビューを作成するように求められることになります。あなたは、そのアイテムのビューが表示されるかどうかを選択する必要はありません。

populateViewのifステートメントがその項目をスキップすると思われるようです。しかし、実際に起こっているのは、単に空のビューがリスト内のその場所を占めるようにしているということです。

代わりに、あなたのリストに興味のある項目だけを生成するクエリを考え出すべきです。これは、あなたの条件を満たすfilter for childrenにFirebaseに伝える必要があることを意味します。残念ながら、2つの条件(usersMapの下のユーザーの数とそのユーザーのキーのブール値の値)としての条件。 Firebaseはそのようなフィルタリングを実行できません。

FirebaseListAdapterは、指定した1つのクエリからの入力のみを受け付けるため、これを手伝ってくれません。

代わりに、場所の内容全体を読んで、必要のない項目を手動で除外し、必要な項目のリストを作成する必要があります。そのリストを持つアダプタを作成すると、ListView(またはより良いRecyclerView)への入力になります。

+0

私は自分の投稿を 'query'で編集しました。しかし、あなたは正しいです、それは/ ShoppingListsのすべてのための単なるDatabaseReferenceです。私は今、問題が何であるかを理解しています。あなたは私が欲しくない項目を手動でフィルタリングする方法を教えてください。ありがとうございました! –

+0

addListenerForSingleValueEvent()を使用して、その場所のすべてのDataSnapshotを取得できます。スナップショットの子を反復して、それぞれに表示したいものが含まれているかどうかを確認し、それらを新しいリストに追加してアダプターに取り込みます。 –

関連する問題