How could i filter the listview using baseadapter How could i filter the listview using baseadapter android android

How could i filter the listview using baseadapter


MainActivity.java

public class MainActivity extends Activity {private ListView mListView;private CustomAdapter mCustomAdapter;private EditText mEditText;private ArrayList<Contacts> _Contacts = new ArrayList<Contacts>();@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    for (int i = 0; i < 100; i++) {        Contacts contacts = new Contacts();        contacts.setId(""+i);        contacts.setName("Name "+i);        _Contacts.add(contacts);    }    mListView = (ListView) findViewById(R.id.listView1);    mEditText = (EditText) findViewById(R.id.editText1);    mCustomAdapter = new CustomAdapter(MainActivity.this, _Contacts);    mListView.setAdapter(mCustomAdapter);    mEditText.addTextChangedListener(new TextWatcher() {        @Override        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            mCustomAdapter.getFilter().filter(arg0);        }        @Override        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,                int arg3) {        }        @Override        public void afterTextChanged(Editable arg0) {        }    });}}

CustomAdapter.java

public class CustomAdapter extends BaseAdapter implements Filterable{private ArrayList<Contacts> _Contacts;private Activity context;private LayoutInflater inflater;private ValueFilter valueFilter;private ArrayList<Contacts> mStringFilterList;public CustomAdapter(Activity context, ArrayList<Contacts> _Contacts) {    super();    this.context = context;    this._Contacts = _Contacts;    mStringFilterList =  _Contacts;    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);     getFilter();}@Overridepublic int getCount() {    return _Contacts.size();}@Overridepublic Object getItem(int position) {    return _Contacts.get(position).getName();}@Overridepublic long getItemId(int position) {    return 0;}public class ViewHolder {    TextView tname, tplace;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {    ViewHolder holder;    if (convertView == null) {        holder = new ViewHolder();        convertView = inflater.inflate(R.layout.activity_main, null);        holder.tname = (TextView) convertView.findViewById(R.id.textView1);        holder.tplace = (TextView) convertView.findViewById(R.id.textView2);        convertView.setTag(holder);    } else        holder = (ViewHolder) convertView.getTag();    holder.tname.setText("" + _Contacts.get(position).getName());    holder.tplace.setText("" + "" + _Contacts.get(position).getId());    return convertView;}@Overridepublic Filter getFilter() {    if(valueFilter==null) {        valueFilter=new ValueFilter();    }    return valueFilter;}private class ValueFilter extends Filter {    //Invoked in a worker thread to filter the data according to the constraint.    @Override    protected FilterResults performFiltering(CharSequence constraint) {        FilterResults results=new FilterResults();        if(constraint!=null && constraint.length()>0){            ArrayList<Contacts> filterList=new ArrayList<Contacts>();            for(int i=0;i<mStringFilterList.size();i++){                if((mStringFilterList.get(i).getName().toUpperCase())                        .contains(constraint.toString().toUpperCase())) {                    Contacts contacts = new Contacts();                    contacts.setName(mStringFilterList.get(i).getName());                    contacts.setId(mStringFilterList.get(i).getId());                    filterList.add(contacts);                }            }            results.count=filterList.size();            results.values=filterList;        }else{            results.count=mStringFilterList.size();            results.values=mStringFilterList;        }        return results;    }    //Invoked in the UI thread to publish the filtering results in the user interface.    @SuppressWarnings("unchecked")    @Override    protected void publishResults(CharSequence constraint,            FilterResults results) {        _Contacts=(ArrayList<Contacts>) results.values;        notifyDataSetChanged();    }}}

Contacts.java

public class Contacts {private String name;private String id;public String getName() {    return name;}public void setName(String name) {    this.name = name;}public String getId() {    return id;}public void setId(String id) {    this.id = id;}}

main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><EditText    android:id="@+id/editText1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:ems="10" >    <requestFocus /></EditText><ListView    android:id="@+id/listView1"    android:layout_width="match_parent"    android:layout_height="wrap_content" ></ListView>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="2dp"android:layout_marginLeft="1dp"android:layout_marginRight="1dp"android:layout_marginTop="2dp"android:background="@android:color/black"android:gravity="center_vertical"android:paddingBottom="2dp"android:paddingTop="2dp"tools:context=".MainActivity" ><TextView    android:id="@+id/textView1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="8dp"    android:text="Large Text"    android:textAppearance="?android:attr/textAppearanceLarge"    android:textColor="@android:color/white" /><TextView    android:id="@+id/textView2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="8dp"    android:text="Small Text"    android:textAppearance="?android:attr/textAppearanceSmall"    android:textColor="@android:color/white" />

This is a sample project code. Use this code this will really help you


Here you go. A simple baseadapter (no view recycling) that will display, and filter, a list of some custom arbitary object. In this example Object.name is the field we will use to filter.

1) In your activity, (or) where you create your ListView, enable text filtering:

class MyObject {    public String name;}List<MyObject> myData = ArrayList<>();listview.setTextFilterEnabled(true);

2) As you already noted, in a textwatcher of an Edittext, trigger the filter on the ListAdapter:

public void onTextChanged(CharSequence s, int start, int before, int count) {    listadapter.getFilter().filter(s);   }

3) in your baseadapter, implement Filterable. And store two copies of the data, one original, and one filtered. Be sure to access the filtered data throughout the BaseAdapter, not the unfiltered data

public class FilterableListAdapterExample extends BaseAdapter implements Filterable {private List<MyObject> mData; //the original dataprivate List<MyObject> mDataFiltered;//the filtered dataprivate LayoutInflater mLayoutInflater;public FilterableListAdapterExample(Context context, List<MyObject> data) {    mData = data;    mDataFiltered=data;    mLayoutInflater = LayoutInflater.from(context);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {    convertView= mLayoutInflater.inflate(R.layout.listview_item, null);    TextView textview=(TextView)convertView.findViewById(R.id.listitem_textview);    //note: we access mDataFiltered, not mData    textview.setText(mDataFiltered.get(position).name);     return convertView;}@Overridepublic long getItemId(int position) {    return position;}@Overridepublic int getCount() {    return mDataFiltered.size();}@Overridepublic Filter getFilter() {    return new Filter() {        @Override        protected FilterResults performFiltering(CharSequence constraint) {            FilterResults results = new FilterResults();            if (constraint == null || constraint.length() == 0) {                //no constraint given, just return all the data. (no search)                results.count = mData.size();                results.values = mData;            } else {//do the search                List<MyObject> resultsData = new ArrayList<>();                String searchStr = constraint.toString().toUpperCase();                for (MyObject o : mData)                    if (o.name.toUpperCase().startsWith(searchStr)) resultsData.add(o);                results.count = resultsData.size();                results.values = resultsData;            }            return results;        }        @Override        protected void publishResults(CharSequence constraint, FilterResults results) {            mDataFiltered = (ArrayList<MyObject>) results.values;            notifyDataSetChanged();        }    };}

}


Please try following code it may helpful for you:

public class MainActivity extends ListActivity {    private List<String> list = new ArrayList<String>();    List<String> mOriginalValues;    @Override    public void onCreate(Bundle savedInstanceState)     {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        final MyAdapter adapter = new MyAdapter(this, getModel());        setListAdapter(adapter);        EditText filterEditText = (EditText) findViewById(R.id.filterText);        // Add Text Change Listener to EditText        filterEditText.addTextChangedListener(new TextWatcher()         {            @Override            public void onTextChanged(CharSequence s, int start, int before, int count)             {                // Call back the Adapter with current character to Filter                adapter.getFilter().filter(s.toString());            }            @Override            public void beforeTextChanged(CharSequence s, int start, int count,int after)             {            }            @Override            public void afterTextChanged(Editable s)             {            }        });    }    private List<String> getModel() {        list.add("Linux");        list.add("Windows7");        list.add("Suse");        list.add("Eclipse");        list.add("Ubuntu");        list.add("Solaris");        list.add("Android");        list.add("iPhone");        list.add("Windows XP");        return list;    }// Adapter Class            public class MyAdapter extends BaseAdapter implements Filterable {    List<String> arrayList;          List<String> mOriginalValues; // Original Values    LayoutInflater inflater;    public MyAdapter(Context context, List<String> arrayList)     {        this.arrayList = arrayList;        inflater = LayoutInflater.from(context);    }    @Override    public int getCount()     {        return arrayList.size();    }    @Override    public Object getItem(int position)     {        return position;    }    @Override    public long getItemId(int position)     {        return position;    }    private class ViewHolder     {        TextView textView;    }    @Override    public View getView(int position, View convertView, ViewGroup parent)     {        ViewHolder holder = null;        if (convertView == null)         {            holder = new ViewHolder();            convertView = inflater.inflate(R.layout.row, null);            holder.textView = (TextView) convertView                    .findViewById(R.id.listTxt);            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        holder.textView.setText(arrayList.get(position));        return convertView;    }    @Override    public Filter getFilter()     {        Filter filter = new Filter()         {            @SuppressWarnings("unchecked")            @Override            protected void publishResults(CharSequence constraint,FilterResults results)             {                arrayList = (List<String>) results.values; // has the filtered values                notifyDataSetChanged();  // notifies the data with new filtered values            }            @Override            protected FilterResults performFiltering(CharSequence constraint)             {                FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values                List<String> FilteredArrList = new ArrayList<String>();                if (mOriginalValues == null)                 {                    System.out.println("");                    mOriginalValues = new ArrayList<String>(arrayList); // saves the original data in mOriginalValues                }                /********                 *                  *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values                 *  else does the Filtering and returns FilteredArrList(Filtered)                   *                 ********/                if (constraint == null || constraint.length() == 0)                 {                    // set the Original result to return                      results.count = mOriginalValues.size();                    results.values = mOriginalValues;                }                 else                 {                    constraint = constraint.toString().toLowerCase();                    for (int i = 0; i < mOriginalValues.size(); i++)                     {                        String data = mOriginalValues.get(i);                        if (data.toLowerCase().startsWith(constraint.toString()))                         {                            FilteredArrList.add(data);                        }                    }                    // set the Filtered result to return                    results.count = FilteredArrList.size();                    results.values = FilteredArrList;                }                return results;            }        };        return filter;    }}}