-
-
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(); | |
} | |
} | |
} |
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
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]
my list comes in a fragment. how can i implement this method there