How to implement getFilter on a BaseAdapter?

前端 未结 7 816
半阙折子戏
半阙折子戏 2020-12-06 03:55

I am trying to implement a getFilter() on a base adapter to filter out search results on a List. Is there any example of how to implement a getFilter()?

MainActivity

7条回答
  •  独厮守ぢ
    2020-12-06 04:20

    this almost got me killed :)

    1. implement your BaseAdapter like this:
    2. define an ArrayList of List in your public adapter class which is gonna contain temporary items of your Original List.

      public class MyAdapter extends BaseAdapter implements Filterable{
      
          public static ArrayList temporarylist;
          public static ArrayList OriginalList;
          private Activity activity;
      
          public MyAdapter(Activity activity, ArrayList OriginalList) {
               super();
               this.activity=activity;
               this.OriginalList = OriginalList;
               temporarylist=OriginalList;
      
          }
          .
          .
          .
      
    3. create getFilter() method with the following code[as an example]:

      public Filter getFilter() {
          Filter filter = new Filter() {
      
          @SuppressWarnings("unchecked")
          @Override
          protected void publishResults(CharSequence constraint, FilterResults results) {
              temporarylist=(ArrayList)results.values;
              notifyDataSetChanged();
          }
      
          @Override
          protected FilterResults performFiltering(CharSequence constraint) {
              FilterResults results = new FilterResults();
              ArrayList FilteredList= new ArrayList();
              if (constraint == null || constraint.length() == 0) {
                  // No filter implemented we return all the list
                  results.values = OriginalList;
                  results.count = OriginalList.size();
              }
              else {
                  for (int i = 0; i < OriginalList.size(); i++) {
                      String data = OriginalList.get(i);
                      if (data.toLowerCase().contains(constraint.toString()))  {
                          FilteredList.add(data);
                      }
                  }
                  results.values = FilteredList;
                  results.count = FilteredList.size();
              }
              return results;
          }
      };
      return filter;
      }
      

    And finally in your activity for your EditText:

    MyAdapter adapter;
    ArrayList items;
    
    
    ListView list = (ListView) findViewById(R.id.list);
    items = new ArrayList();
    for (int i=0;i<30;i++){
         items.add("Hello world "+String.valueof(i));
    }
    adapter = new GameAdapter(this, items);
    list.setAdapter(adapter);
    
    
    EditText inputSearch = (EditText) findViewById(R.id.Search_txt);
         inputSearch.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                    // When user changed the Text
                    MyActivity.this.adapter.getFilter().filter(cs);
                }
    
                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                        int arg3) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub                          
                }
            });
    

提交回复
热议问题