android – AutoCompleteTextView过滤问题

我有一个AutoCompleteTextView和一个自定义的AutoCompleteTextView适配器.

我的清单有20个项目,所有项目都包含“vodafone”字符串.当我在AutoCompleteTextView中键入一个字符时,它显示结果,第二个,它不显示列表.例如;

<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

为什么会这样?有什么建议?

这是我的适配器:

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();
  }

}

 }

并设置适配器代码:

 AutoCompleteTextAdapter2 adapter = new AutoCompleteTextAdapter2(myAct, GlobalVariables.currCategoryItems);
yeniMarkaModel.setAdapter(adapter);

最佳答案 在返回结果之前,必须将筛选的项目数分配给FilterResults.count.文本控件为下拉列表分配了这么多行.

原因是AutoCompleteTextView从不直接使用values字段,而是要求您的Adapter获取具有特定索引的项目.例如,这使得可以始终将整个项集合传递给值,但只返回其中一些来自Adapter.getItem().

点赞