IndexOutOfBoundsException после фильтрации адаптера - PullRequest
0 голосов
/ 26 марта 2019

У меня есть элемент управления автозаполнением, который будет рисоваться из 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.

1 Ответ

0 голосов
/ 26 марта 2019

Я наконец-то заработал.Основная проблема заключалась в том, что мой адаптер использовал ArrayAdapter вместо BaseAdapter.

, как только я это отключил, он работает как задумано, не уверен , почему я не могу использовать ArrayAdapter но я очень рад, что мой контроль автозаполнения наконец работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...