Skip to main content

Android custom searchable ListView with Custom Filter

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

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

Popular posts from this blog

Installing liferay 6.2 on wildfly 10 app server and oracle 11g database & windows machine

*************************************DATABASE CREATION*********************************************************************************************** DOWNLOAD LIFERAY PORTAL SCRIPTS FROM https://www.liferay.com/downloads/liferay-portal/available-releases Rename the file as liferay.sql put it let say in under c drive , so it will be located like this  c:\liferay.sql from cmd dir c:\ SQLPLUS / AS SYSDBA @liferay.sql lportal lportal it will create the db ..after finishing go to sqlplus again to ggrant the below  to lportal user SQLPLUS / AS SYSDBA grant create session to lportal; grant connect to lportal; grant resource to lportal; *******************************CONFIGURE WILDFLY TO CONNECT TO ORACLE DB *****************************************************************************************************  configure wildfly to connect to oracle db Download the driver: ojdbc[VERSION].jar Create subfolders [WILDFLY_HOME]/modules/system/layers/base/com/o...

oracle drop all tables and sequences in a certain schema

--  please never put a comment starting with " / "  as this character means execute the previous line  BEGIN   FOR i IN (SELECT us.sequence_name               FROM USER_SEQUENCES us) LOOP     EXECUTE IMMEDIATE 'drop sequence '|| i.sequence_name ||'';   END LOOP;     FOR i IN (SELECT ut.table_name               FROM USER_TABLES ut) LOOP     EXECUTE IMMEDIATE 'drop table '|| i.table_name ||' CASCADE CONSTRAINTS ';   END LOOP; END; -- the following character executes the whole block of pl sql code /

itext 2.7.1 writing Arabic and English content in a PDF file

   public void createPdf(String filename) throws IOException, DocumentException {               Document document = new Document();           PdfWriter.getInstance(document, new FileOutputStream(filename));             document.open();             document.add(Chunk.NEWLINE);        FontFactory.register("c:/windows/fonts/tradbdo.ttf", "my_arabic");               Font myArabicFont = FontFactory.getFont("my_arabic" ,BaseFont.IDENTITY_H, BaseFont.EMBEDDED);         PdfPTable table = new PdfPTable(1);         table.getDefaultCell().setNoWrap(false);        // table.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);         PdfPCell text = new PdfPCell(new Phrase("محمود السنباطيthis is أبتثجحخدرزسشصضطظعغفقكلمنهوى", myAr...