如何使我的ArrayAdapter(For AutocompleteTextview)返回提供的子字符串的所有结果

时间:2016-02-22 11:26:33

标签: android android-arrayadapter android-adapter

我正在尝试让我的AutocompleteTextview返回包含所提供的子字符串的所有结果,但是它只返回带有提供的子字符串的START结果。

当前结果集是

0:  "CMPN0004:Gigrig"
1:  "CMPN0002:NYDA"
2:  "CMPN0003:TEST"

如果输入“CMP”,它会正确执行自动完成,但如果我输入“TEST”或“Gigrig”,它就不会提供任何结果

final AutoCompleteTextView campaignTxt = (AutoCompleteTextView)findViewById(R.id.CampaignTxt);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(TripAddActivity.this,android.R.layout.simple_dropdown_item_1line, campaigns);

1 个答案:

答案 0 :(得分:0)

您需要覆盖getFilterdescribed here:

  

您遇到问题,主要是因为您使用的是自定义对象。如果   您将String或int值传递给数组适配器,它知道如何过滤   它。但是如果你传递自定义对象的默认过滤器实现了   不知道如何处理。

     

虽然目前尚不清楚您在过滤器中尝试做什么i   建议你按照以下步骤。

     
      
  1. 正确实施ListTO,虽然它与您现在的目标无关
  2.   
  3. 实施自定义过滤器
  4.   
  5. 返回您的过滤器
  6.         

    实施自定义过滤器

         

    您要做的第一件事就是来自您的implements Filterable   数组适配器。

         

    其次,提供Filter

    的实施
    Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
               FilterResults filterResults = new FilterResults();   
               ArrayList<ListTO> tempList=new ArrayList<ListTO>();
               //constraint is the result from text you want to filter against. 
               //objects is your data set you will filter from
               if(constraint != null && objects!=null) {
                   int length=objects.size();
                   int i=0;
                    while(i<length){
                      ListTO item=objects.get(i);
                          //do whatever you wanna do here
                      //adding result set output array     
    
                          tempList.add(item);
    
                          i++;
                    }
                    //following two lines is very important
                    //as publish result can only take FilterResults objects
                    filterResults.values = tempList;
                    filterResults.count = tempList.size();
              }
              return filterResults;
          }
    
          @SuppressWarnings("unchecked")
          @Override
          protected void publishResults(CharSequence contraint, FilterResults results) {
            objects = (ArrayList<ListTO>) results.values;
              if (results.count > 0) {
                 notifyDataSetChanged();
              } else {
                  notifyDataSetInvalidated();
              }  
          }
       };
    
         

    最后一步,

    @Override
       public Filter getFilter() {
          return myFilter;
      }