2017-07-26 11 views
0

Firebaseを照会し、リサイクラーアダプターに照会のDataSnapshotの条件付きデータを取り込もうとしています。私はpopulate関数をif文の中に入れてみましたが、必要なデータは正しくログに記録されていましたが、代わりにリサイクラビューは検索していたノード(私が始めたメインクエリ)からすべてを返します。 "if"ステートメントに当てはまる項目を埋める方法についての提案はありますか?ありがとうございました!あなたはuはこれを使用することができます任意の特定のノードを抽出したい場合はAndroid:Firebase RecyclerViewで条件付きDataSnapshot値を使用するには?

rootRef = FirebaseDatabase.getInstance().getReference(); 
    //below is the node i query 
    mAlbumQuery = rootRef.child(Constants.FIREBASE_CHILD_ALBUMS).orderByChild("genres"); 
    mAlbumQuery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot reco : dataSnapshot.getChildren()) { 
       if (reco.getValue().toString().contains(mRecommendation.getGenre())) { 
        //below returns the items i want 
        Log.d("is this correct", reco.getValue().toString()); 
        //below returns everything in the original query 
        //how to populate only items that match the above? 
        mAdapter = new FirebaseRecyclerAdapter<Album, AlbumsViewHolder>(
          Album.class, 
          R.layout.album_cards, 
          AlbumsViewHolder.class, 
          mAlbumQuery) { 
         @Override 
         public void populateViewHolder(AlbumsViewHolder holder, Album album, int position) { 
          holder.bindView(album.getImage(), album.getTitle()); 
          if (!album.getGenres().contains(mRecommendation.getGenre())) { 
           //added as a hypothetical... should i have something in here? 
          } 
         } 
        }; 
        mAlbumsRecycler.setAdapter(mAdapter); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    return view; 
} 

答えて

0

: -

String notific = String.valueOf(dataSnapshot.getValue()); 

int key=dataSnapshot.getKey(); 
String title=String.valueOf(dataSnapshot.child("title").getValue()); 
String content=String.valueOf(dataSnapshot.child("content").getValue()); 
+0

これはどのようにしてリサイクルビューで使用できますか? – DarkKnightSDS

1

さて、あなたはFirebaseRecyclerAdapterにPARAMとしてmAlbumQueryを送信する場合、私は信じて、それは数としてそのサイズを取りますアイテム。オプションとして

(簡単な修正のために)あなたは新しいコレクションを作成し、このループ内ですることができます

for (DataSnapshot reco : dataSnapshot.getChildren()) { 
} 

あなたが必要な項目とその新しいコレクションを埋めることができます。
ループの後に、新しいアダプタを作成して、それにフィルターされたコレクションを渡すことができます。ここで

は、私がこれを見る方法です。

@Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Collection<> myNewCollection = new Collection<>(); //HashMap, ArrayList - depends on what you are storing in Firebase 
      for (DataSnapshot reco : dataSnapshot.getChildren()) { 
       if (reco.getValue().toString().contains(mRecommendation.getGenre())) { 
        //below returns the items i want 
        Log.d("is this correct", reco.getValue().toString()); 
        //below returns everything in the original query 
        //how to populate only items that match the above? 
        myNewCollection.add(reco.getValue); 
       } 
      } 

      recyclerView.setAdapter(new MyRecyclerViewAdapter(myNewCollection, ...)); 
     } 

はまたPLS Firebase docsthis SO questionを見てみましょう。
興味深い方法 - startAtendAtequalToがあります。私は方法containsを見つけることができませんでしたが、上記の方法では十分であるかもしれません。

+0

ええと、私はmAlbumQueryを変更する必要があると思います...私はちょうどその場所を取るべきかどうかを判断しようとしています。よく分かりません。あなたが言及した新しいコレクションはどこに作成すればよいですか? – DarkKnightSDS

+0

更新された回答を参照してください。 –

+0

ありがとうございます、私は今日これについて取り組み、それがどのように進むのかをお知らせします。 Containsはオブジェクトに存在しないため、toStringを最初にやらなければなりませんでした。私は、文字列プロパティ内の特定のキーワードを検索し、キーワードを持つものだけを返そうとしています。 – DarkKnightSDS

関連する問題