Search code examples
androidautocompletetextview

how to show suggestions of autocomplete Text Box contains with??


AutoComplete box dropdown suggestions not showing contains with its showing StartWith.

this is my code

 final ArrayList<String> listFilterJob = new ArrayList<>();
    listFilterJob.add("Anuj");
    listFilterJob.add("Akshay");
    listFilterJob.add("Ananta");
    listFilterJob.add("Muskan");
    listFilterJob.add("sachin");

    ArrayAdapter adapterFiltersJob = new ArrayAdapter(this,   android.R.layout.simple_list_item_1, listFilterJob);
    edtFilterJob.setThreshold(1);
    edtFilterJob.setDropDownWidth(350);
    edtFilterJob.setAdapter(adapterFiltersJob);

When i type "an" to autocomplete textbox its show result Anuj and Ananta in dropdown list but i want Anuj, Ananta and Muskan. how can i do this, help me.


Solution

  • You need to extend the ArrayAdapter that implements Filterable. Check this SO question and the answer: Filtering AutoCompleteTextView to show partial match

    So your solution would be (the combination of question and answer):

    public class CodesArrayAdapter extends ArrayAdapter implements Filterable{
    
        List<String> allCodes;
        List<String> originalCodes;
        StringFilter filter;
    
        public CodesArrayAdapter(Context context, int resource, List<String> keys) {
            super(context, resource, keys);
            allCodes=keys;
            originalCodes=keys;
        }
    
        public int getCount() {
            return allCodes.size();
        }
    
        public Object getItem(int position) {
            return allCodes.get(position);
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        private class StringFilter extends Filter {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
    
                String filterString = constraint.toString().toLowerCase();
                FilterResults results = new FilterResults();
                final List<String> list = originalCodes;
    
                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) {
                allCodes = (ArrayList<String>) results.values;
                notifyDataSetChanged();
            }
    
        }
    
    
        @Override
        public Filter getFilter()
        {
            return new StringFilter();
        }
    }