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...

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...

Liferay Migration form 5.2.3 to 6.2

Liferay Migration form 5.2.3 to 6.2 Liferay Migration from 5.2.3. to 6.2 Step 1. Migration to 6.0.6 1. Create 5.2.3 DB dump (db.sql). 2. Create database for LR 6.0.6 (db606). 3. Load 5.2.3 dump into 6.0.6 database: mysql -uroot -p1 db606 < db.sql; Delete all database views (if any). 4. Unzip clean Liferay 6.0.6. 5. Delete all folders from ' webapps ' (except ' ROOT ' and ' tunnel-web '); delete jre from tomcat folder. 6. Copy 'data' folder from Liferay 5.2.3 to Liferay 6.0.6. 7. Startup Liferay 6.0.6 (with default Hypersonic database settings). 8. Shutdown Liferay 6.0.6. 9. Create  portal-ext.properties  file: jdbc.default.driverClassName=com.mysql.jdbc.Driver jdbc.default.url=jdbc:mysql://localhost:3306/db606?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false jdbc.default.username=root jdbc.default.password=1 permissions.user.check.algorithm=5 image.hook.impl=com....