Я добавил обновленный код.
я естьautocomplete text view
в моем проекте Android, который работает нормально, но он работает, только если в него введено первое значение. Чтобы сделать его более настраиваемым, я добавил следующий класс
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();
}
В моем фрагменте я сделал следующее
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());
}
});
В приведенном выше кодеsmartMsnSpinner
мой автозаполнение просмотра текста
Когда я запускаю свое приложение, автозаполнение не работает. Я пробовал некоторые другие адаптеры, которые размещены через Интернет. Но результат все тот же. Я пытаюсь использовать этот пользовательский адаптер, потому что в моем другом приложении он работает идеально, и в этом коде я делаю то же самое.
Обновление 1
После предложения я изменил код пользовательского адаптера, учитывая, что другая часть кода такая же, как добавленная выше.
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);
}
}
}
Любая помощь будет высоко ценится.