4

I have aAutoCompleteTextView and a custom AutoCompleteTextView adapter.

my list has 20 items and All items contains "vodafone" string. When i type one character in AutoCompleteTextView, it shows the results and on second, it does not shows the list. For example;

<br/>->V
<br/>-->AutoComplete DropDown menu appears
<br/>->Vo
<br/>-->AutoComplete DropDown disappears
<br/>->Vod
<br/>-->AutoComplete DropDown menu appears
<br/>->Voda
<br/>-->AutoComplete DropDown disappears
<br/>...etc

Why it's happening? Any suggestions?

here is my adapter:

package listadapters;

import java.util.ArrayList;
import java.util.Locale;

import objects.Item;
import utils.Logging;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
public class AutoCompleteTextAdapter2 extends BaseAdapter implements Filterable {

   Context _context;
   ArrayList<Item> _items = new ArrayList<Item>();

   public AutoCompleteTextAdapter2(Context context, ArrayList<Item> items) {

       _context = context;


       for (int i = 0; i < items.size(); i++) {
           _items.add(new Item(items.get(i)));
        }

       for (int i = 0; i < _items.size(); i++) {
            orig.add(new Item(_items.get(i)));
        }
       filter = new ItemFilter();

   }

   @Override
   public int getCount() {
       if (_items != null)
           return _items.size();
       else
           return 0;
   }

   @Override
   public Object getItem(int arg0) {
       return _items.get(arg0);
   }

   @Override
   public long getItemId(int arg0) {

       return 0;
   }

   @Override
   public View getView(int arg0, View arg1, ViewGroup arg2) {

       View gv;

       if (arg1 == null){

           gv = new View(_context);
       }else {
           gv = (View) arg1;
       }
       return gv;
   }



  @Override

  public Filter getFilter() {

      return filter;

  }

  private ItemFilter filter;

  ArrayList<Item> orig = new ArrayList<Item>();

  private class ItemFilter extends Filter {

      public ItemFilter() {

  }

  ArrayList<Item> results = new ArrayList<Item>();
  @Override
  protected FilterResults performFiltering(CharSequence constraint) {

      if(constraint != null)
          Logging.TraceMessage(constraint.toString(), "**", "1");
      FilterResults oReturn = new FilterResults();

      if (orig == null){
        for (int i = 0; i < _items.size(); i++) {
            orig.add(new Item(_items.get(i)));
        }
      }

      if (constraint != null){
          results.clear();
          if (orig != null && orig.size() > 0) {
              for (Item i : orig) {
                  if (i._itemName.toLowerCase(Locale.US).contains(constraint.toString().toLowerCase(Locale.US))){
                      results.add(new Item(i));
                  }
              }
          }
          Logging.TraceMessage(String.valueOf(results.size()), "**", "2");
          oReturn.values = results;
      }
      return oReturn;
  }


  @SuppressWarnings("unchecked")
  @Override
  protected void publishResults(CharSequence constraint, FilterResults results) {
      _items.clear();
      for(int i = 0; i < ((ArrayList<Item>)results.values).size(); i++){
          _items.add(new Item(((ArrayList<Item>)results.values).get(i)));
      }
      notifyDataSetChanged();
  }

}

 }

and set adapter code:

 AutoCompleteTextAdapter2 adapter = new AutoCompleteTextAdapter2(myAct, GlobalVariables.currCategoryItems);
yeniMarkaModel.setAdapter(adapter);
Savas Adar
  • 4,083
  • 3
  • 46
  • 54

1 Answers1

2

You MUST assign the number of items you filtered to the FilterResults.count before you return your results. The text control allocates this many lines for the drop-down.

The reason for this is that the AutoCompleteTextView never uses the values field directly but rather asks your Adapter to fetch an item with a specific index. This makes it possible, for instance, to always pass the whole collection of items to values but only return some of them from Adapter.getItem().

SnakE
  • 2,355
  • 23
  • 31