2016-08-03 4 views
3

問題FirebaseRecyclerAdapter - 作成後にデータベースクエリを変更する方法を

私はFirebaseRecyclerAdapterを通じてアンドロイドに表示される項目のリストを持っています。私はアイテムのすべてのリストにデータベース参照を使ってこのアダプタを作成します( "posts"としましょう)。投稿にはカテゴリも表示され、ユーザがカテゴリをクリックすると、そのカテゴリのアイテムのみを表示するようにリストを更新したいと思います。私は「カテゴリ」のTextViewとするとき、その上にユーザーがクリックは、私は新しいデータベースクエリを使用して新しいアダプタをインスタンス化しようとしたが、そうでないのクリックリスナを入れ 動作しないことを試みた

ソリューション作業。

その他のアイデア: は特殊なアダプタの外にそれを実行します。 がフラグメントを再起動し、新しいクエリを使用して新しいアダプタを作成するために、新しいテントを作成

は、誰かが上で同じような状況に対処しました質問ユーザーがアドパターによって取り出されたアイテムの元のリストをフィルタリングしたいのですか? 最適なソリューションは何ですか?

詳細

protected void populateViewHolder(final PostViewHolder viewHolder, final Post post, final int position) { 


    /* Set the post text, author and category */ 
    viewHolder.postText.setText(post.getText()); 
    viewHolder.postAuthor.setText(post.getAuthor()); 
    viewHolder.postCategory.setText(post.getCategory()); 

    /* Set a listener on category so that 
     I refresh data with only that category */ 
    viewHolder.quoteCategory.setOnClickListener(new View.OnClickListener() { 

     Post selectedPost = getItem(position); 

     @Override 
     public void onClick(View v) { 

      String category = selectedPost.getCategory(); 

      // !!!! NOW I HAVE TO CHANGE DATA SET !!! /// 

私は今、私が正しいDbを参照して新しいアダプタを使用して新しいフラグメントを作成することができると思う...しかし、これが最善の方法ですか? 別のクエリを渡して、同じAdapaterをPopulateビュー内で使用する方法はありますか?

答えて

1

クリックが発生したときに、アダプタで.notifyDatasetChanged()を呼び出してみてください。新しいfirebaseデータでデータセットを変更した後。

+0

回答をありがとうございますが、問題はデータセットの変更を通知することではありません...問題は、データセットを変更した後に、すでにそのアドパートが作成されていることです。 "データセットを変更した後、" ...どうすればいいですか? – DavideN

0

火災ベースのデータを更新するためのコードです。ここでは、タイトルと本文として機能するために渡された2つのパラメータを更新します。

private void writeNewPost(String userId, String username, String title, String body) { 

     String key = mDatabase.child("posts").push().getKey(); 
     Post post = new Post(userId, username, title, body); 
     Map<String, Object> postValues = post.toMap(); 

     Map<String, Object> childUpdates = new HashMap<>(); 
     childUpdates.put("/posts/" + key, postValues); 
     childUpdates.put("/user-posts/" + userId + "/" + key, postValues); 

     mDatabase.updateChildren(childUpdates); 
    } 

これはあなたに役立つと思います。

+0

答えをいただきありがとうございます。私はデータを更新/変更したくありません...私はそれらをUIで別々にフィルタリングしたいと思います。 私が見つけた解決策は、新しいフラグメントを作成し、それを新しいfirebaseadapterで呼び出すことです。ここで、コンストラクタに別のfirebaseクエリを引数として渡します – DavideN

1

クエリを変更せずに新しいアダプタとクエリを作成し、リサイクラビューでアダプタを置き換え、古いものをクリーンアップします。ここ

は、スピナーでの選択に基づいて、「クエリを変更する」、一例である:

locationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(final AdapterView<?> adapterView, final View view, 
     final int i, final long l) { 
      if (locationSpinner.getSelectedItem() != null) { 
       final Location location = locationSpinner.getSelectedItem(); 
       final String indexString = String.format("open/%s/", location.getId()); 
       final Query query = FirebaseDatabase.getInstance() 
         .getReference("availabilities") 
         .orderByChild("statusLocationDateKey") 
         .startAt(indexString + "0") // simplified for example 
         .endAt(indexString + "9"); // simplified for example 
       adapter = new ListingAdapter(query); 
       final FirebaseRecyclerAdapter oldAdapter = 
         (FirebaseRecyclerAdapter) listing.getAdapter(); 
       listing.setAdapter(adapter); 
       if (oldAdapter != null) { 
        oldAdapter.cleanup(); 
       } 
      } 
     } 

注:ListingAdapterFirebaseRecyclerAdapterlistingのサブクラスRecyclerViewあります。

はまた、上記のコードで、アダプターがこれまでに初期化されたという保証は例えば、存在しないため、活動又はその断片のため を破壊するのではnullチェックを必ず含めてください:

@Override 
public void onDestroyView() { 
    if (adapter != null) { 
     adapter.cleanup(); 
    } 
    super.onDestroyView(); 
} 
関連する問題