2016-05-04 11 views
0

私はrecycviewを作成するためにCardviewを使用しています。CardViewをRecyclerViewでフィルタリングし、カードを更新せず、常に最初のカードを表示します。

私はEditTextフィールドでフィルタリングしていますが、これはデバッグからわかっています。

問題は、私がadapter.notifyDataSetChanged();と呼んだとき、一番上のカードが残っていることです。あなたは"ge"で2枚のカードがあることがわかります画像では、私が上でフィルタリングしてい

私の4つの文字列である

Antwerpen 
Deinze 
Gent 
Edegem 

を(どのように多くのカードに応じて、フィルタを介して得た)が、唯一の2トップ正しい文字列ではありません。

私は断片の中でcontainer.removeAllViewsInLayout();を覗いてみましたが、どこで実装するのか分かりません。私はlayoutInflaterの前にOnCreateViewHolderでこれを行いましたが、フィルターは機能しますが、カードはうまく表示されません。

enter image description here

私はJeffaleeによって与えられた答えを実装しましたUPDATE

は、応答をありがとう!

でも、同じ問題が残っていますが、私は以下のコードを投稿します。

アダプタ:

public class GemeenteAdapter extends RecyclerView.Adapter<GemeenteAdapter.GemeenteViewHolder> { 

    private List<Gemeente> gemeentes; 
    private List<Gemeente> filteredList; 


    public GemeenteAdapter(List<Gemeente> gemeentes, List<Gemeente> original) { 
     this.gemeentes = gemeentes; 
     filteredList = new ArrayList<>(); 
    } 

    @Override 
    public int getItemCount() { 
     if (isFilterActive) { 
      return filteredList.size(); 
     } else { 
      return gemeentes.size(); 
     } 
    } 

    @Override 
    public void onBindViewHolder(GemeenteAdapter.GemeenteViewHolder holder, int i) { 
     Gemeente gemeente; 
     if (isFilterActive) { 
      gemeente = filteredList.get(i); 
     } else { 
      gemeente = gemeentes.get(i); 
     } 
     GemeenteViewHolder.vNaam.setText(gemeente.naam); 
    } 


    @Override 
    public GemeenteViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_cardview_small, viewGroup, false); 
     return new GemeenteViewHolder(v); 
    } 


    public static class GemeenteViewHolder extends RecyclerView.ViewHolder { 
     protected static TextView vNaam; 
     public GemeenteViewHolder(View v) { 
      super(v); 
      vNaam = (TextView) v.findViewById(R.id.txtNaam); 
     } 
    } 


    /** 
    * FILTER TEST 2 
    */ 

    boolean isFilterActive = false; 

    public void setFilter(String searchCriteria) { 

     setFilteredItems(searchCriteria); 
     isFilterActive = true; 
     notifyDataSetChanged(); 
    } 

    public void clearFilter() { 
     isFilterActive = false; 
     notifyDataSetChanged(); 
    } 

    private void setFilteredItems(String searchCriteria) { 
     System.out.println(searchCriteria); 
     for (Gemeente item : gemeentes) { 
      if (item.getNaam().toLowerCase().trim().contains(searchCriteria.toLowerCase())) { 
       System.out.println(item.getNaam()); 
       filteredList.add(item); 
      } 
     } 
    } 

FRAGMENT:

public class FragmentSearch extends Fragment { 
    //Methode om de fragment te initializeren 
    public static FragmentSearch newInstance() { 
     FragmentSearch fragment = new FragmentSearch(); 
     return fragment; 
    } 

    public FragmentSearch() { 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_recycler_gemeente, container, false); 
     Context context = getActivity(); 
     RecyclerView rv = (RecyclerView) view.findViewById(R.id.cardList); 

     rv.setHasFixedSize(true); 


     LinearLayoutManager llm = new LinearLayoutManager(context); 
     llm.setOrientation(LinearLayoutManager.VERTICAL); 
     rv.setLayoutManager(llm); 

     Gemeente gemeente = new Gemeente(); 
     final GemeenteAdapter adapter = new GemeenteAdapter(gemeente.init(),gemeente.init()); 

     rv.setAdapter(adapter); 

     /** 
     * Set filter when text is changed in EditText 
     */ 
     final EditText yourEditText = (EditText) view.findViewById(R.id.edittext); 

     yourEditText.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      } 


      @Override 
      public void afterTextChanged(Editable s) { 
       adapter.setFilter(yourEditText.getText().toString()); 


      } 
     }); 
     return view; 
    } 

私は、これはいくつかの詳細は君たちを与える願っています。

+0

こんにちは、問題は解決しましたか?もしそうなら、あなたの解決策について助言してもらえますか?私も同様の問題に直面しています。 – AJW

答えて

1

検索エンジン 'ge'、Gent、Edegemには2つの検索結果があります。 Adapterの数を適切な数(この場合は2)に設定します。しかし、あなたのonBindViewHolder()メソッドでは、フィルタリングされた項目の位置を取ることを忘れましたList。私が通常RecyclerViewをフィルタリングするのは以下の通りです。

ステップ1:(私はあなたがStringArrayListを使用していると仮定した項目の二Listを作成:(私はすでにこれをしなかったと仮定)あなたのRecyclerViewため

ステップ2をカスタムAdapterを作成します。検索条件(この例では「ge」)に一致する項目と、AdapterがフィルタリングされたListまたはフィルタリングされていないものを使用するかどうかを追跡するbooleanの項目で満たされます。List

List<String> items = new ArrayList<>(); 
    List<String> filteredItems = new ArrayList<>(); 
    boolean isFilterActive = false; 

ステップ3:

public void setFilter(String searchCriteria) { 
     setFilteredItems(searchCriteria); 
     isFilterActive = true; 
     notifyDataSetChanged(); 
    } 

    public void clearFilter() { 
     isFilterActive = false; 
     notifyDataSetChanged(); 
    } 

    private void setFilteredItems(String searchCriteria) { 
     for(String item: items) { 
      if(item.toLowerCase().contains(searchCriteria.toLowerCase())) { 
       filteredItems.add(item); 
      } 
     } 
    } 

ステップ4:各位置で適切ITEMCOUNT個と適切な項目を返しますこのようなカスタムアダプタでsetFilter(String searchCriteria)clearFilter()メソッドを作成します。

@Override 
    public int getItemCount() { 
     if(isFilterActive) { 
      return filteredItems.size(); 
     } else { 
      return items.size(); 
     } 
    } 

そして、これはあなたのRecyclerViewの使用に表示する右のアイテムを取得するには:

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     String item; 
     if (isFilterActive) { 
      item = filteredItems.get(position); 
     } else { 
      item = items.get(position); 
     } 

     //TODO set the value of 'item' to your TextView 
    } 

ステップ5:フィルタを呼び出すだけで、これを使用し、フィルター項目のための適切な量を戻すにはメソッド。必要な場合は、単にあなたのRecyclerViewからアダプタを取得することができますし、このような(カスタムAdapterクラスにキャストした後)のセット/クリアフィルタメソッドを呼び出します。

 MyCustomAdapter adapter = (MyCustomAdapter) myRecyclerView.getAdapter(); 
     adapter.setFilter("ge"); 

または

 adapter.clearFilter(); 

・ホープこれは役に立ちます!

+0

こんにちはJeffalee、答えてくれてありがとう、私は運がないあなたのコードを実装しました。私は自分のコードで自分の質問を更新しました。私は何か小さいものを見逃していると感じ、いつものように、小さなものは大きな頭痛を与えることができます.. – Sytham

関連する問題