0

SearchListAdapter.javaRecyclerView Listenelemente Suche mit EditText filterbar Implementierung funktionieren nicht

RecyclerView Liste Suche mit EditText filterbar Umsetzung nicht funktionieren. Bitte überprüfen Sie diesen Code. Hier in meinem Fall ist die Liste gefiltert, aber RecyclerView-Adapter wird nicht geändert, aufgrund der Liste bleibt gleich.

/** 
* Created by Dell on 4/8/2016. 
*/ 
public class SearchListAdapter extends RecyclerView.Adapter<SearchListAdapter.ViewHolder> implements Filterable { 

    private Context context; 
    public static ArrayList<ChapterListModel> chapterList; 

    private List<ChapterListModel> orignalChapterList = new ArrayList<>(); 
    private final List<ChapterListModel> filteredChapterList; 

    public SearchListAdapter(Context context, ArrayList<ChapterListModel> chapterList) { 
     this.context = context; 
     this.chapterList = chapterList; 
     orignalChapterList = chapterList; 
     filteredChapterList = new ArrayList<>(); 

    } 


    @Override 
    public SearchListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ViewHolder(
       LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row_chapter_list, parent, false) 
     ); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 

     holder.title.setText(chapterList.get(position).getTitle()); 
    } 


    @Override 
    public int getItemCount() { 
     return chapterList.size(); 
    } 

    @Override 
    public Filter getFilter() { 
     return new CustomFilter(this, orignalChapterList); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     TextView title; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      title = (TextView) itemView.findViewById(R.id.textView); 
     } 
    } 

    public class CustomFilter extends Filter { 
     private SearchListAdapter adapter; 
     private final List<ChapterListModel> originalList; 
     private final List<ChapterListModel> filteredList; 

     private CustomFilter(SearchListAdapter adapter, List<ChapterListModel> originalList) { 
      super(); 
      this.adapter = adapter; 
      this.originalList = new LinkedList<>(originalList); 
      this.filteredList = new ArrayList<>(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      filteredList.clear(); 
      final FilterResults results = new FilterResults(); 

      if (constraint.length() == 0) { 
       filteredList.addAll(originalList); 
      } else { 
       final String filterPattern = constraint.toString().toLowerCase().trim(); 

       for (final ChapterListModel chapter : originalList) { 
        if (chapter.getTitle().contains(filterPattern)) { 
         filteredList.add(chapter); 
        } 
       } 
      } 
      results.values = filteredList; 
      results.count = filteredList.size(); 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      adapter.filteredChapterList.clear(); 
      adapter.filteredChapterList.addAll((List<ChapterListModel>) results.values); 
      adapter.notifyDataSetChanged(); 
     } 
    } 
} 
+0

für Ihren 'SearchListAdapter', woher bekommen Sie die Daten? – pskink

+0

Von einer anderen Aktivität übergebe ich die Daten mit Hilfe von Konstruktor. SearchListAdapter (Kontextkontext, ArrayList chapterList) { – jazzbpn

+0

siehe [dies] (https://gist.github.com/pskink/4484c9237b2b31f90fa4748d3488b329) Adapter – pskink

Antwort

0

Ihre onBindViewHolder und getItemCount Methoden sollten die filteredChapterList werden. Im Moment filtern Sie Ihre Liste, indem Sie den Adapter der Änderung korrekt benachrichtigen, aber Sie verwenden immer die ursprüngliche Liste!

In Ihrem Konstruktor, sollten Sie auch filteredChapterList = new ArrayList<>(originalChapterList)

+0

Sorry, aber das geht nicht. – jazzbpn

0

Endlich fertig ändern, aber eine andere Art und Weise, nicht die Umsetzung fiterable verwenden.

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


      final String query = s.toString().toLowerCase().trim(); 
      final ArrayList<ChapterListModel> filteredList = new ArrayList<>(); 

      for (int i = 0; i < chapterLists.size(); i++) { 

       final String text = chapterLists.get(i).getTitle().toLowerCase(); 
       if (text.contains(query)) { 
        filteredList.add(chapterLists.get(i)); 
       } 
      } 

      recyclerView.setLayoutManager(new LinearLayoutManager(SearchActivity.this)); 
      adapter = new SearchListAdapter(SearchActivity.this, filteredList); 
      recyclerView.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); // data set changed 


     }