1

私は、うまく動作している私のアンドロイドプロジェクトにautocomplete text viewを持っていますが、最初の値が入力されている場合にのみ動作します。それはより多くのカスタマイズ作るために、私は私のフラグメントでは、以下のクラスカスタムアダプタフィルタリングが動作しないAutoCompleteTextView

public class CustomArrayAdapterWIthFilter extends ArrayAdapter<String> implements Filterable { 
List<String> items = null; 
List<String> originalItems = null; 
private MyFilters myFilters = null; 
Context mContext; 

public CustomArrayAdapterWIthFilter(@NonNull Context context, @LayoutRes int resource, @NonNull List<String> objects) { 
    super(context, resource, objects); 
    this.items = new ArrayList<>(); 
    items.addAll(objects); 
    this.originalItems = new ArrayList<>(); 
    this.originalItems.addAll(objects); 
    mContext = context; 
} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Nullable 
@Override 
public String getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 

@NonNull 
@Override 
public Filter getFilter() { 
    if (myFilters == null) { 
     myFilters = new MyFilters(); 
    } 
    return myFilters; 
} 

class MyFilters extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     FilterResults result = new FilterResults(); 

     if (constraint != null && constraint.toString().length() > 0) { 
      ArrayList<String> filteredItems = new ArrayList<String>(); 

      for (int i = 0, l = originalItems.size(); i < l; i++) { 
       String item = originalItems.get(i); 
       if (item.toString().toLowerCase().contains(constraint)) 
        filteredItems.add(item); 
      } 
      result.count = filteredItems.size(); 
      result.values = filteredItems; 
     } else { 
      synchronized (this) { 
       result.values = originalItems; 
       result.count = originalItems.size(); 
      } 
     } 
     return result; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     items = (ArrayList<String>) results.values; 
     notifyDataSetChanged(); 
     clear(); 
     for (int i = 0, l = items.size(); i < l; i++) 
      add(items.get(i)); 
     notifyDataSetInvalidated(); 
    } 
} 

public void addItems(List<String> items) { 
    this.items = items; 
    notifyDataSetChanged(); 
} 

を追加しているので、私は上記のコードsmartMsnSpinnerでは、次の

CustomArrayAdapterWIthFilter meterSrNumAdapter; 
if (meterSrNumAdapter.getCount() == 0) { 
      meterSrArrayList = new MeterManager(getActivity()).getRefNoByStatus(Constants.SR_NO_UN_USED); 
      meterSrArrayList.add(installationDetails.getMsn()); 
      meterSrNumAdapter.addItems(meterSrArrayList); 
     } 
if (meterSrNumAdapter.getCount() == 0) { 
      meterSrArrayList = new MeterManager(getActivity()).getRefNoByStatus(Constants.SR_NO_UN_USED); 
      meterSrNumAdapter.addItems(meterSrArrayList); 
     } 

meterSrArrayList = new ArrayList<String>(); 
    meterSrNumAdapter = new CustomArrayAdapterWIthFilter(getActivity(), R.layout.custom_spinner_layout, meterSrArrayList); 
    smartMsnSpinner.setAdapter(meterSrNumAdapter); 
    smartMsnSpinner.setSingleLine(true); 
    smartMsnSpinner.setThreshold(1); 

    smartMsnSpinner.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      selectedMeterNo = adapterView.getItemAtPosition(i).toString(); 
      Log.d("testtt", adapterView.getItemAtPosition(i).toString()); 
     } 


    }); 

を行っていることは、私のオートコンプリートテキストビュー

である場合にはI私のアプリを実行するとオートコンプリートは機能しません。私はインターネット上に置かれているいくつかの他のアダプタを試してみました。しかし、それでも結果は同じです。私はこのカスタムアダプターを試しています。私の別のアプリでは完璧に動作していますし、このコードでも同じことをしています。すべてのヘルプは高く評価されるだろう

List<String> suggestionItems = null; 

//In constructor 
this.items = new ArrayList<>(objects); 

this.originalItems = new ArrayList<>(objects); 

mContext = context; 

class MyFilters extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     if(constraint !=null) 
     { 
      suggestionItems.clear(); 

      for(int i=0, i1 = originalItems.size(); i <i1; i++) 
      { 
       String item = originalItems.get(i); 
       if(item.toString().toLowerCase().contains(constraint)) 
        suggestionItems.add(item); 
      } 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = suggestionItems; 
      filterResults.count = suggestionItems.size(); 
      return filterResults; 
     } 
     else 
     { 
      return new FilterResults(); 
     } 

    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     if(results !=null && results.count > 0) 
     { 
      items.clear(); 
      items = (ArrayList<String>)results.values; 
      notifyDataSetChanged(); 
     } 
     else 
     { 
      items.addAll(originalItems); 
     } 
    } 
} 

上に追加として

コードの他の部分を考慮しながら、私は、カスタムアダプター・コードを変更した提案更新後1

は同じです。

コンストラクタで

答えて

-1

すべてを追加使用する必要はありません、あなたは次のように割り当てて、アダプタの1以上を作成し、

List<String> suggestionItems = null; 

//constructor should be like this 

this.items = new ArrayList<>(objects); 
this.originalItems = new ArrayList<>(objects); 
this.suggestionItems = new ArrayList<>(); 

とフィルタは

class MyFilters extends Filter { 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     if (constraint != null) 
     { 
      suggestionItems .clear(); 
      for (int i = 0, l = originalItems.size(); i < l; i++) { 
       String item = originalItems.get(i); 
       if (item.toString().toLowerCase().contains(constraint)) 
        suggestionItems .add(item); 
      } 
      FilterResults filterResults = new FilterResults(); 
      filterResults.values = suggestionItems ; 
      filterResults.count = suggestionItems .size(); 
      return filterResults; 
     } 
     else 
     { 
      return new FilterResults(); 
     } 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     if (results != null && results.count > 0) { 
      items.clear(); 
      items = (ArrayList<String>) results.values; 
      notifyDataSetChanged(); 
     } 
     else { 
      items .addAll(originalItems); 
     } 
    } 
} 
+0

する必要がありますすることができますだけで – Shanmugam

+0

を試してみました... 1上にしてみてくださいしかし、動作していません – faisal1208

+0

'constraint'がnullです – faisal1208

関連する問題