Skip to content Skip to sidebar Skip to footer

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"