I have an autocomplete text view in my Android project that works fine, but it only works if the first value is entered into it. Therefore, to make it more customizable, I added a class below
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(); }
In my fragment I did the following
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()); } });
In the above smartMsnSpinner code smartMsnSpinner is my autocomplete text view
When I launch my application, autocomplete does not work. I tried some other adapters that are hosted over the Internet. But the result is the same. I am trying to use this custom adapter because it works fine in my other application, and in this code I do the same.
Update 1
After the sentence, I changed the code of the user adapter, believing that the other part of the code is the same as added above
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); } } }
Any help would be greatly appreciated.
android android-arrayadapter android-filterable custom-adapter autocompletetextview
faisal1208 Oct 31 '17 at 11:41 2017-10-31 11:41
source share