Listview Filtering Not Working - Android
I am tying to implement search functionality in my app. I am using a custom ArrayAdapter for the listview as I have two textViews in a row. My app doesn't force clos
Solution 1:
Add this cus.setSearchFilterItemListener(this);
before navList.setAdapter(cus);
Update
Step 1 Create an interface
publicinterfaceSearchFilterItemListener {
publicvoidsetData(String[] myArray);
}
Step 2 Update your custom adapter class
classCustomAdapterextendsArrayAdapter<String> {
String A[], B[], origA[], origB[];
LayoutInflater mInflater;
publicCustomAdapter(Context context, String[] A,String B[]) {
super(context, R.layout.list_item, A);
this.A = A;
this.B = B;
this.origA = A;
this.origB = B;
mInflater = LayoutInflater.from(context);
}
publicViewgetView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
holder = newViewHolder();
holder.tv1 = (TextView)convertView.findViewById(R.id.element_name);
holder.tv2 = (TextView)convertView.findViewById(R.id.element_nos);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.tv1.setText(A[position]);
holder.tv2.setText(B[position]);
return convertView;
}
staticclassViewHolder {
TextView tv1,tv2;
}
@OverridepublicFiltergetFilter() {
if (listFilter == null)
listFilter = newTabFilter();
return listFilter;
}
privateclassTabFilterextendsFilter {
@OverrideprotectedFilterResultsperformFiltering(CharSequence constraint) {
// TODO Auto-generated method stubFilterResults results = newFilterResults();
// Filter Logicif (constraint == null || constraint.length() == 0) {
// No filter, return all the list
results.values = origA; //considering that you want to filter on the String[] A
results.count = origA.size();
} else {
// We perform filtering operationString[] nList = newString[A.length];
for (int counter = 0; counter < A.length; counter++) {
if (A[counter].toUpperCase(Locale.US).startsWith(constraint.toString().toUpperCase(Locale.US)))
nList[counter] = A[counter];
}
results.values = nList;
results.count = nList.length;
}
return results;
}
@OverrideprotectedvoidpublishResults(CharSequence constraint, FilterResults results) {
// TODO Auto-generated method stub// Now we have to inform the adapter about the new filtered listif (results.count == 0)
notifyDataSetInvalidated();
else {
A = (String[]) results.values;
String[] newList = newString[A.length];
newList = A.clone();
notifyDataSetChanged();
mSearchListener.setData(newList);
}
}
}
publicString[] getSearchList() {
return A;
}
publicvoidsetSearchFilterItemListener(SearchFilterItemListener mSearchFilterListener) {
mSearchListener = mSearchFilterListener;
}
}
Solution 2:
ok so this is your adapter:
classCustomAdapterextendsArrayAdapter<Item> {
LayoutInflater mInflater;
publicCustomAdapter(Context context) {
super(context, 0);
mInflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
convertView = mInflater.inflate(android.R.layout.simple_expandable_list_item_2, parent, false);
holder = newViewHolder();
holder.tv1 = (TextView)convertView.findViewById(android.R.id.text1);
holder.tv2 = (TextView)convertView.findViewById(android.R.id.text2);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
Itemitem= getItem(position);
holder.tv1.setText(item.text1);
holder.tv2.setText(item.text2);
return convertView;
}
}
now you have Item class holding two Strings:
classItem {
String text1;
String text2;
Item(String t1, String t2) {
text1 = t1;
text2 = t2;
}
@OverridepublicStringtoString() {
return text1;
}
}
and the ViewHolder:
classViewHolder {
TextView tv1, tv2;
}
now test it in onCreate (try to press any letter, "p" for example to filter out thos items starting with "p":
CustomAdapter adapter = new CustomAdapter(this);
for (int i = 0; i < elename.length; i++) {
adapter.add(new Item(elename[i], nos[i]));
}
lv = new ListView(this);
lv.setTextFilterEnabled(true);
lv.setAdapter(adapter);
setContentView(lv);
Post a Comment for "Listview Filtering Not Working - Android"