AutoCompleteTextView过滤器问题 [英] AutoCompleteTextView filter problem

查看:200
本文介绍了AutoCompleteTextView过滤器问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 AutoCompleteTextView 自定义AutoCompleteTextView适配器。

我的列表中有20个项目,所有项目包含沃达丰字符串。当我键入​​ AutoCompleteTextView 一个字符,它显示的结果和第二,它不会显示在列表。 例如;

 < BR />  - > V
< BR />  - >出现自动完成下拉菜单
< BR />  - >武
< BR />  - >自动完成下拉消失
< BR />  - >点播
< BR />  - >出现自动完成下拉菜单
< BR />  - >沃达
< BR />  - >自动完成下拉消失
< BR /> ...等
 

为什么发生?有什么建议?

这是我的适配器:

 包listadapters;

进口的java.util.ArrayList;
进口java.util.Locale中;

进口objects.Item;
进口utils.Logging;

进口android.content.Context;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.Filter;
进口android.widget.Filterable;
公共类AutoCompleteTextAdapter2扩展了BaseAdapter实现过滤的{

   语境_context;
   ArrayList的<项目> _items =新的ArrayList<项目>();

   公共AutoCompleteTextAdapter2(上下文的背景下,ArrayList的<项目>项目){

       _context =背景;


       的for(int i = 0; I< items.size();我++){
           _items.add(新项目(items.get(我)));
        }

       的for(int i = 0; I< _items.size();我++){
            orig.add(新项目(_items.get(我)));
        }
       过滤器=新ItemFilter();

   }

   @覆盖
   公众诠释getCount将(){
       如果(_items!= NULL)
           返回_items.size();
       其他
           返回0;
   }

   @覆盖
   公共对象的getItem(INT为arg0){
       返回_items.get(为arg0);
   }

   @覆盖
   众长getItemId(INT为arg0){

       返回0;
   }

   @覆盖
   公共查看getView(INT为arg0,查看ARG1,ARG2的ViewGroup){

       查看GV;

       如果(ARG1 == NULL){

           GV =新景(_context);
       }其他 {
           GV =(查看)ARG1;
       }
       返回GV;
   }



  @覆盖

  公共过滤用getFilter(){

      返回过滤器;

  }

  私人ItemFilter过滤器;

  ArrayList的<项目>原稿=新的ArrayList<项目>();

  私有类ItemFilter扩展过滤器{

      公共ItemFilter(){

  }

  ArrayList的<项目>结果=新的ArrayList<项目>();
  @覆盖
  保护FilterResults performFiltering(CharSequence的约束){

      如果(约束!= NULL)
          Logging.TraceMessage(constraint.toString(),**,1);
      FilterResults oReturn =新FilterResults();

      如果(原稿== NULL){
        的for(int i = 0; I< _items.size();我++){
            orig.add(新项目(_items.get(我)));
        }
      }

      如果(约束!= NULL){
          results.clear();
          如果(原稿=空&安培;!&安培;原稿尺寸()大于0){
              为(项目一:原稿){
                  如果(i._itemName.toLowerCase(Locale.US)。载​​(constraint.toString()。与toLowerCase(Locale.US))){
                      results.add(新(i)项);
                  }
              }
          }
          Logging.TraceMessage(将String.valueOf(results.size()),**,2);
          oReturn.values​​ =结果;
      }
      返回oReturn;
  }


  @燮pressWarnings(未登记)
  @覆盖
  保护无效publishResults(CharSequence的约束,FilterResults结果){
      _items.clear();
      对(INT I = 0; I&≤((的ArrayList&其中;项目&GT)results.values​​).size();我++){
          _items.add(新项目(((ArrayList中<项目>)results.values​​)获得(一)));
      }
      notifyDataSetChanged();
  }

}

 }
 

并设置适配器code:

  AutoCompleteTextAdapter2适配器=新AutoCompleteTextAdapter2(myAct,GlobalVariables.currCategoryItems);
yeniMarkaModel.setAdapter(适配器);
 

解决方案

您必须将你过滤了 FilterResults.count 的项目数返回你的结果之前。文本控件分配这么多线下拉。

这样做的原因是, AutoCompleteTextView 从来没有使用字段直接,而是问你的适配器来获取的项目与一个特定的指数。这使得,例如,总是通过项目的整个集合,但只返回有些是从 Adapter.getItem()

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

解决方案

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().

这篇关于AutoCompleteTextView过滤器问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆