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