The idea is on how to implement the custom filter in a good way free of bugs.
In this example i ave a list of materials and i am supposed to select from it and search inside it as well.
The filter here is anonymous class inside the materials adapter.
The adapter class
And inside the activity i added a listener to a textBox to search inside the listView
In this example i ave a list of materials and i am supposed to select from it and search inside it as well.
The filter here is anonymous class inside the materials adapter.
The adapter class
package com.dash.util;
import java.util.ArrayList;
import java.util.List;
import com.dash.patientmaterials.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
/**
 * 
 * @author melsonbati@hotmail.com
 *
 */
public class MaterialsAdapter extends ArrayAdapter<MaterialItem> implements Filterable{
 private List<MaterialItem> allMaterials;
 private List<MaterialItem> filterdMaterials;
 View row;
    int resLayout;
    Context context;
 
    public MaterialsAdapter(Context context, int layoutId, List<MaterialItem> allMaterials) {
        super(context, layoutId, allMaterials);
  
        this.allMaterials = new ArrayList<MaterialItem>();
        this.allMaterials.addAll(allMaterials);
        resLayout = layoutId;
        this.context = context;
    }
 
 
 @Override
     public Filter getFilter() {
   
         return new Filter() {
             @SuppressWarnings("unchecked")
             @Override
             protected void publishResults(CharSequence constraint, FilterResults results) {
              
                  filterdMaterials = (ArrayList<MaterialItem>)results.values;
                  notifyDataSetChanged();
                  clear();
                  if(filterdMaterials==null){
                   filterdMaterials= new ArrayList<MaterialItem>();
                   filterdMaterials.addAll(allMaterials);
                   
                  }              
                  for(int i = 0 , l = filterdMaterials.size(); i < l; i++)
                      add(filterdMaterials.get(i));
                  notifyDataSetInvalidated();     
       
             }
             
             @Override
             protected FilterResults performFiltering(CharSequence constraint) {
             
              constraint = constraint.toString().toLowerCase();
               FilterResults result = new FilterResults();
               if(constraint != null && constraint.toString().length() > 0){
               
                ArrayList<MaterialItem> filteredItems = new ArrayList<MaterialItem>();
                
                for(int i = 0, l = allMaterials.size(); i < l; i++){
                 MaterialItem m= allMaterials.get(i);
                 if(m.getMatDesc().toLowerCase().contains(constraint)){
                 
                  filteredItems.add(m);
                 }
              
                 
                  result.count = filteredItems.size();
                  result.values = filteredItems;     
               
                }
                
               }else{
               
                  synchronized(this){
                    
                          result.values = allMaterials;
                          result.count = allMaterials.size();
                       
                     } 
               }
              
                 return result;
             }
   
         };
         
     }
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
     
        row = convertView;
        if(row == null)
        {   // inflate our custom layout. resLayout == R.layout.row_team_layout.xml
            LayoutInflater ll = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = ll.inflate(resLayout, parent, false);
        }
        if(filterdMaterials==null){
         filterdMaterials= new ArrayList<MaterialItem>();
         filterdMaterials.addAll(allMaterials);
         
        }
   
        MaterialItem item = filterdMaterials.get(position); // Produce a row for each Team.
   
        if(item != null)
        {   // Find our widgets and populate them with the Team data.
            TextView matDescription = (TextView) row.findViewById(R.id.listview_MatDescription);
            TextView matId = (TextView) row.findViewById(R.id.listview_MatId);
            if(matDescription != null)
             matDescription.setText(item.getMatDesc());
            if(matId != null)
             matId.setText(item.getMatNumber());
        }
        return row;
    }        
}
And inside the activity i added a listener to a textBox to search inside the listView
  searchMaterial.addTextChangedListener(new TextWatcher() {
   @Override
   public void afterTextChanged(Editable arg0) {
    
    
   }
   @Override
   public void beforeTextChanged(CharSequence arg0, int arg1,
     int arg2, int arg3) {
   
   }
   @Override
   public void onTextChanged(CharSequence searchKeys, int arg1, int arg2,
     int arg3) {
    
   PatientMaterialActivity.this.matAdapter.getFilter().filter(searchKeys);
   
  
   }
   
   
  });
Comments
Post a Comment