How to implement getFilter on a BaseAdapter?
android, baseadapter, filter, listview
Solution
in your adapter put this class to use it in getfilter method
//this is a simple class that filtering the ArrayList of strings used in adapter
public class filter_here extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// TODO Auto-generated method stub
FilterResults Result = new FilterResults();
// if constraint is empty return the original names
if(constraint.length() == 0 ){
Result.values = Original_Names;
Result.count = Original_Names.size();
return Result;
}
ArrayList<String> Filtered_Names = new ArrayList<String>();
String filterString = constraint.toString().toLowerCase();
String filterableString;
for(int i = 0; i<Original_Names.size(); i++){
filterableString = Original_Names.get(i);
if(filterableString.toLowerCase().contains(filterString)){
Filtered_Names.add(filterableString);
}
}
Result.values = Filtered_Names;
Result.count = Filtered_Names.size();
return Result;
}
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
// TODO Auto-generated method stub
Names = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
return instance from it in getfilter
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return filter;
}
full example
Problem
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.java ``` final AppInfoAdapter adapter = new AppInfoAdapter(this, Utilities.getSystemFilteredApplication(this), getPackageManager()); public void onTextChanged(CharSequence s, int start, int before, int count) { adapter.getFilter().filter(s); //Filter from my adapter adapter.notifyDataSetChanged(); //Update my view } ``` AppInfoAdapter.java ``` package com.example.permission; import java.util.List; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; public class AppInfoAdapter extends BaseAdapter implements Filterable{ private Context mContext; private List mListAppInfo; PackageManager mPackManager; public AppInfoAdapter(Context c, List list, PackageManager pm) { mContext = c; mListAppInfo = list; mPackManager = pm; } public int getCount() { return mListAppInfo.size(); } public Object getItem(int position) { return mListAppInfo.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { // get the selected entry ApplicationInfo entry = (ApplicationInfo) mListAppInfo.get(position); // reference to convertView View v = convertView; // inflate new layout if null if(v == null) { LayoutInflater inflater = LayoutInflater.from(mContext); v = inflater.inflate(R.layout.layout_appinfo, null); } // load controls from layout resources ImageView ivAppIcon = (ImageView)v.findViewById(R.id.ivIcon); TextView tvAppName = (TextView)v.findViewById(R.id.tvName); TextView tvPkgName = (TextView)v.findViewById(R.id.tvPack); // set data to display ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager)); tvAppName.setText(entry.loadLabel(mPackManager)); tvPkgName.setText(entry.packageName); // return view return v; } public Filter getFilter() { // TODO Auto-generated method stub return null; } } ``` EDIT: Edited the code and added full AppInfoAdapter.java