Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I filter ListView data when typing on EditText in android

Tags:

android

I have a ListView and a EditText. How can I filter ListView data when typing on EditText?

like image 579
Dennie Avatar asked Oct 29 '09 17:10

Dennie


2 Answers

  1. Add TextWatcher to EditText#addTextChangedListener
  2. In onTextChanged add or remove items from your ListView's adapter. If you are subclassing ArrayAdapter it would have add and remove methods
like image 179
Bostone Avatar answered Oct 05 '22 05:10

Bostone


Yes you can, just implement this code. Use the following code to implement search and filter list in android:

SearchAndFilterList.java

public class SearchAndFilterList extends Activity {      private ListView mSearchNFilterLv;      private EditText mSearchEdt;      private ArrayList<String> mStringList;      private ValueAdapter valueAdapter;      private TextWatcher mSearchTw;      @Override     public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_search_and_filter_list);          initUI();          initData();          valueAdapter=new ValueAdapter(mStringList,this);          mSearchNFilterLv.setAdapter(valueAdapter);          mSearchEdt.addTextChangedListener(mSearchTw);       }     private void initData() {          mStringList=new ArrayList<String>();          mStringList.add("one");          mStringList.add("two");          mStringList.add("three");          mStringList.add("four");          mStringList.add("five");          mStringList.add("six");          mStringList.add("seven");          mStringList.add("eight");          mStringList.add("nine");          mStringList.add("ten");          mStringList.add("eleven");          mStringList.add("twelve");          mStringList.add("thirteen");          mStringList.add("fourteen");          mSearchTw=new TextWatcher() {              @Override             public void onTextChanged(CharSequence s, int start, int before, int count) {                  valueAdapter.getFilter().filter(s);             }              @Override             public void beforeTextChanged(CharSequence s, int start, int count,                     int after) {              }              @Override             public void afterTextChanged(Editable s) {              }         };      }      private void initUI() {          mSearchNFilterLv=(ListView) findViewById(R.id.list_view);          mSearchEdt=(EditText) findViewById(R.id.txt_search);     }  } 

Custom Value adapter: ValueAdapter.java

public class ValueAdapter extends BaseAdapter implements Filterable{  private ArrayList<String> mStringList;  private ArrayList<String> mStringFilterList;  private LayoutInflater mInflater;  private ValueFilter valueFilter;  public ValueAdapter(ArrayList<String> mStringList,Context context) {      this.mStringList=mStringList;      this.mStringFilterList=mStringList;      mInflater=LayoutInflater.from(context);      getFilter(); }  //How many items are in the data set represented by this Adapter. @Override public int getCount() {      return mStringList.size(); }  //Get the data item associated with the specified position in the data set. @Override public Object getItem(int position) {      return mStringList.get(position); }  //Get the row id associated with the specified position in the list. @Override public long getItemId(int position) {      return position; }  //Get a View that displays the data at the specified position in the data set. @Override public View getView(int position, View convertView, ViewGroup parent) {      Holder viewHolder;      if(convertView==null) {          viewHolder=new Holder();          convertView=mInflater.inflate(R.layout.list_item,null);          viewHolder.nameTv=(TextView)convertView.findViewById(R.id.txt_listitem);          convertView.setTag(viewHolder);      }else{          viewHolder=(Holder)convertView.getTag();     }          viewHolder.nameTv.setText(mStringList.get(position).toString());          return convertView; }  private class  Holder{      TextView nameTv; }  //Returns a filter that can be used to constrain data with a filtering pattern. @Override public 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<String> filterList=new ArrayList<String>();              for(int i=0;i<mStringFilterList.size();i++){                  if(mStringFilterList.get(i).contains(constraint)) {                      filterList.add(mStringFilterList.get(i));                  }             }               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) {          mStringList=(ArrayList<String>) results.values;          notifyDataSetChanged();       }  } 

activity_search_and_filter_list.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent" >      <EditText         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:id="@+id/txt_search"         tools:context=".SearchAndFilterList"         android:hint="Enter text to search" />     <ListView          android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:id="@+id/list_view"         android:layout_below="@+id/txt_search"></ListView>  </RelativeLayout> 

list_item.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent" >     <TextView          android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:id="@+id/txt_listitem"/>  </RelativeLayout> 

AndroidManifext.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.searchandfilterlistview"     android:versionCode="1"     android:versionName="1.0" >      <uses-sdk         android:minSdkVersion="8"         android:targetSdkVersion="15" />      <application         android:icon="@drawable/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme" >         <activity             android:name=".SearchAndFilterList"             android:label="@string/title_activity_search_and_filter_list" >             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application>  </manifest> 

I hope this code will will helpful to implement custom search and filter listview.

like image 21
Mahesh Avatar answered Oct 05 '22 06:10

Mahesh