2016-05-04 32 views
0

我正在使用卡片視圖來填充我的recyclerview。使用RecyclerView過濾CardView,不更新卡片,始終顯示第一張卡

我正在過濾一個EditText字段,這工作正常,我從調試中知道。

問題是,當我打電話adapter.notifyDataSetChanged();頂級卡留。 (取決於有多少卡通過過濾器得到)

我的4個字符串我在過濾是

Antwerpen 
Deinze 
Gent 
Edegem 

在你可以看到,"ge"有2張卡的圖像,但只有2頂那些......不是正確的字符串。

我已經在我的片段中撥弄了container.removeAllViewsInLayout();,但我不確定在哪裏實現它。我在layoutInflater之前的OnCreateViewHolder中這樣做了,但之後過濾器正常工作,但卡片沒有很好地顯示出來。

enter image description here

UPDATE

我實現了由Jeffalee給出的答案,謝謝你的回答!

但沒有運氣,仍然有同樣的問題,我會在下面發佈我的代碼。

適配器:

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); 
      } 
     } 
    } 

片斷:

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

會發生什麼是有兩個searchcriteria'ge',Gent和Edegem的結果。您將您的Adapter的計數設置爲正確的數量(在這種情況下爲2)。但在您的onBindViewHolder()方法中,您忘記了已過濾的List項目的位置。我通常做的過濾RecyclerView如下。

步驟1:創建自定義AdapterRecyclerView(我假設你已經這樣做)

第2步:創建項目的第二List(我假設你正在使用StringArrayList s),其中將填充與搜索標準匹配的項目(本例中爲'ge')和boolean,如果Adapter應該使用已過濾的List或未過濾的List

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

第3步:這樣創建您的自定義適配器setFilter(String searchCriteria)clearFilter()方法:

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和適當的項目在每個位置。要返回適量的過濾項,只要使用此:

@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

相關問題