У меня есть элемент управления автозаполнением, который будет рисоваться из API для построения выпадающего списка автозаполнения. У меня все подключено, но я получаю эту ошибку при наборе:
03-26 13: 41: 40.546 E / AndroidRuntime (31931): java.lang.IndexOutOfBoundsException: индекс: 0, размер: 0
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на java.util.ArrayList.get (ArrayList.java:437)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.widget.ArrayAdapter.getItem (ArrayAdapter.java:385)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.widget.AutoCompleteTextView.buildImeCompletions (AutoCompleteTextView.java:1243)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.widget.AutoCompleteTextView.showDropDown (AutoCompleteTextView.java:1203)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.widget.AutoCompleteTextView.updateDropDownForFilter (AutoCompleteTextView.java:1086)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.widget.AutoCompleteTextView.onFilterComplete (AutoCompleteTextView.java:1068)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.widget.Filter $ ResultsHandler.handleMessage (Filter.java:285)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.os.Handler.dispatchMessage (Handler.java:106)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.os.Looper.loop (Looper.java:164)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на android.app.ActivityThread.main (ActivityThread.java:6494)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на java.lang.reflect.Method.invoke (собственный метод)>
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438)
03-26 13: 41: 40.546 E / AndroidRuntime (31931): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)
Мой класс адаптера
public class UserFilterAdapter : ArrayAdapter<UserAutoComplete>, IFilterable
{
private readonly Context _context;
private readonly int _textViewResourceId;
private readonly Filter _filter;
private List<UserAutoComplete> _userAutoComplete;
public override int Count => _userAutoComplete?.Count ?? 0;
public override Filter Filter => _filter;
public DirectoryOrgUnitFilterAdapter(List<UserAutoComplete> userAutoComplete, Context context, int textViewResourceId) : base(context, textViewResourceId)
{
_context = context;
_filter = new UserAutoCompleteFilter(this);
_textViewResourceId = textViewResourceId;
_userAutoComplete = userAutoComplete;
}
public void RefreshAdapter(List<UserAutoComplete> userAutoComplete)
{
_userAutoComplete = userAutoComplete;
NotifyDataSetChanged();
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
var inflater = (LayoutInflater) _context.GetSystemService(Context.LayoutInflaterService);
convertView = inflater.Inflate(_textViewResourceId, parent, false);
}
var itemName = convertView.FindViewById<TextView>(Resource.Id.user_autocomplete_item_name);
var itemType = convertView.FindViewById<TextView>(Resource.Id.user_autocomplete_item_type);
var item = GetItem(position);
itemName.Text = item.UserName;
itemType.Text = item.Email;
return convertView;
}
}
Мой класс фильтра
public class UserAutoCompleteFilter : Filter
{
private readonly UserFilterAdapter _adapter;
public UserAutoCompleteFilter(UserFilterAdapter adapter)
{
_adapter = adapter;
}
protected override FilterResults PerformFiltering(ICharSequence constraint)
{
var results = new FilterResults();
if (string.IsNullOrEmpty(constraint?.ToString()))
{
return results;
}
var searchFor = constraint.ToString();
if (searchFor.Length < 3)
{
return results;
}
var matches = ApiService.GetUsers(searchFor).ConfigureAwait(false).GetAwaiter().GetResult();
results.Values = FromArray(matches.Select(r => r.ToJavaObject()).ToArray());
results.Count = matches.ToList().Count;
constraint.Dispose();
return results;
}
protected override void PublishResults(ICharSequence constraint, FilterResults results)
{
if (results?.Values == null)
{
return;
}
using (var values = results.Values)
{
_adapter.RefreshAdapter(values.ToArray<Object>().Select(a => a.ToNetObject<UserAutoComplete>()).ToList());
}
constraint.Dispose();
results.Dispose();
}
}
Я отлаживал логику, и фильтрация получает данные и возвращает их, поэтому я теряюсь в том, где они теряют данные и выдают исключение за пределами границ.
Я следовал этому учебнику по настройке фильтрации для работы в C #, а затем этому учебнику по применению его к элементу управления автозаполнением textview.