-
-
Save fjfish/3024308 to your computer and use it in GitHub Desktop.
| <?xml version="1.0" encoding="utf-8"?> | |
| <TextView xmlns:android="http://schemas.android.com/apk/res/android" | |
| android:id="@+id/list_view" | |
| android:layout_width="fill_parent" | |
| android:layout_height="fill_parent" | |
| android:padding="10dp" | |
| android:textSize="16sp" > | |
| </TextView> |
| package com.yourco.yourapp; | |
| import java.util.ArrayList; | |
| import java.util.List; | |
| import android.content.Context; | |
| import android.view.LayoutInflater; | |
| import android.view.View; | |
| import android.view.ViewGroup; | |
| import android.widget.BaseAdapter; | |
| import android.widget.Filter; | |
| import android.widget.Filterable; | |
| import android.widget.TextView; | |
| // The standard text view adapter only seems to search from the beginning of whole words | |
| // so we've had to write this whole class to make it possible to search | |
| // for parts of the arbitrary string we want | |
| public class SearchableAdapter extends BaseAdapter implements Filterable { | |
| private List<String>originalData = null; | |
| private List<String>filteredData = null; | |
| private LayoutInflater mInflater; | |
| private ItemFilter mFilter = new ItemFilter(); | |
| public SearchableAdapter(Context context, List<String> data) { | |
| this.filteredData = data ; | |
| this.originalData = data ; | |
| mInflater = LayoutInflater.from(context); | |
| } | |
| public int getCount() { | |
| return filteredData.size(); | |
| } | |
| public Object getItem(int position) { | |
| return filteredData.get(position); | |
| } | |
| public long getItemId(int position) { | |
| return position; | |
| } | |
| public View getView(int position, View convertView, ViewGroup parent) { | |
| // A ViewHolder keeps references to children views to avoid unnecessary calls | |
| // to findViewById() on each row. | |
| ViewHolder holder; | |
| // When convertView is not null, we can reuse it directly, there is no need | |
| // to reinflate it. We only inflate a new View when the convertView supplied | |
| // by ListView is null. | |
| if (convertView == null) { | |
| convertView = mInflater.inflate(R.layout.list_item, null); | |
| // Creates a ViewHolder and store references to the two children views | |
| // we want to bind data to. | |
| holder = new ViewHolder(); | |
| holder.text = (TextView) convertView.findViewById(R.id.list_view); | |
| // Bind the data efficiently with the holder. | |
| convertView.setTag(holder); | |
| } else { | |
| // Get the ViewHolder back to get fast access to the TextView | |
| // and the ImageView. | |
| holder = (ViewHolder) convertView.getTag(); | |
| } | |
| // If weren't re-ordering this you could rely on what you set last time | |
| holder.text.setText(filteredData.get(position)); | |
| return convertView; | |
| } | |
| static class ViewHolder { | |
| TextView text; | |
| } | |
| public Filter getFilter() { | |
| return mFilter; | |
| } | |
| private class ItemFilter extends Filter { | |
| @Override | |
| protected FilterResults performFiltering(CharSequence constraint) { | |
| String filterString = constraint.toString().toLowerCase(); | |
| FilterResults results = new FilterResults(); | |
| final List<String> list = originalData; | |
| int count = list.size(); | |
| final ArrayList<String> nlist = new ArrayList<String>(count); | |
| String filterableString ; | |
| for (int i = 0; i < count; i++) { | |
| filterableString = list.get(i); | |
| if (filterableString.toLowerCase().contains(filterString)) { | |
| nlist.add(filterableString); | |
| } | |
| } | |
| results.values = nlist; | |
| results.count = nlist.size(); | |
| return results; | |
| } | |
| @SuppressWarnings("unchecked") | |
| @Override | |
| protected void publishResults(CharSequence constraint, FilterResults results) { | |
| filteredData = (ArrayList<String>) results.values; | |
| notifyDataSetChanged(); | |
| } | |
| } | |
| } |
Thank you! This helped me a lot!
Thank you.. And another thanks to "eiprol" for editing
Amazing!!! A small edit,
public int getCount() {
return filteredData == null ? 0 : filteredData.size();
}
Perfect now :)
But when I do BackSpace, it is sorting until it has at least one character. On deleting the entire data, drop down is not shown. and when I click it again drop down is not coming.
WHYYYYYYYYYYY???????
@ganesh76 How do we show the default list when text is removed. Do you have any solution for this?
@prathibhaprabs You must update the results.values with the reference to the original data.
I've done this with the code below, before the for:
if (filterString.isEmpty()) {
results.values = list;
results.count = list.size();
return results;
}
Thank you!!
Thanks a lot!! This helped me so much!
Thanks
[simple star or follow button could have omitted this unwanted comment]
your search functionality is working fine but your code makes list view empty when we remove all characters in search field. it should load all the default data again