私は、うまく動作している私のアンドロイドプロジェクトに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
は同じです。
コンストラクタで
する必要がありますすることができますだけで – Shanmugam
を試してみました... 1上にしてみてくださいしかし、動作していません – faisal1208
'constraint'がnullです – faisal1208