Я не могу понять, как обойти эту ошибку Looper.prepare () при попытке использовать мой пользовательский Android ArrayAdapter - PullRequest
0 голосов
/ 03 апреля 2019

Я создал пользовательский ArrayAdapter, чтобы я мог отфильтровать результаты для моего AutoCompleteTextView:

public class AutoCompleteCountryAdapter extends ArrayAdapter<String>
{
    private List<String> countryListFull;

    public AutoCompleteCountryAdapter(@NonNull Context context, int resource, @NonNull List<String> countryList)
    {
        super(context, resource, countryList);
        countryListFull = new ArrayList<>(countryList);
    }

    @NonNull
    @Override
    public Filter getFilter()
    {
        return countryFilter;
    }

    private Filter countryFilter = new Filter()
    {
        @Override
        protected FilterResults performFiltering(CharSequence constraint)
        {
            FilterResults filterResults = new FilterResults();
            List<String> suggestions = new ArrayList<>();

            if (constraint == null || constraint.length() == 0)
            {
                suggestions.addAll(countryListFull);
            } else
            {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (String country : countryListFull)
                {
                    if (country.toLowerCase().startsWith(filterPattern))
                    {
                        suggestions.add(country);
                    }
                }
            }

            filterResults.values = suggestions;
            filterResults.count = suggestions.size();

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults)
        {
            clear();
            addAll((List) filterResults.values);
            notifyDataSetChanged();
        }

        @Override
        public CharSequence convertResultToString(Object resultValue)
        {
            return ((String) resultValue);
        }
    };
}

Однако, когда я пытаюсь использовать этот адаптер:

List<String> placeOfBirthList;

AutoCompleteCountryAdapter pobAdapter = new AutoCompleteCountryAdapter(new AutoCompleteCountryAdapter(getApplication().getApplicationContext(), android.R.layout.simple_dropdown_item_1line, placeOfBirthList));

Я получаю эту ошибку Logcat:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Я получаю это исключение в строке, которая является первой фигурной скобкой после создания нового фильтра:

private Filter countryFilter = new Filter()
{ // HERE

Я не вызываю это из моего MainActivity.java, но из обычного метода в пределах ViewModel из Fragment другой деятельности.

public class MyViewModel extends AndroidViewModel {

    private List<String> placeOfBirthList;

    public MyViewModel(Application application) {
        super(application);
        myMethod();
    }

    private void myMethod() {
        AutoCompleteCountryAdapter myAdapter = new AutoCompleteCountryAdapter(getApplication().getApplicationContext(), android.R.layout.simple_dropdown_item_1line, placeOfBirthList);
    }
}

1 Ответ

0 голосов
/ 10 апреля 2019

Итак ... Я исправил проблему. По предложению коллеги я перенес создание пользовательского адаптера ArrayAdapter в свой фрагмент View:

FragmentBinding binding = ~~~;
MyViewModel mViewModel = ~~~;
binding.setViewModel(mViewModel);
AutoCompleteCountryAdapter myAdapter = new AutoCompleteCountryAdapter(getContext(), android.R.layout.simple_dropdown_item_1line, viewModel.getPlaceOfBirthList());
binding.placeOfBirthField.setAdapter(myAdapter);

И это исправило все мои проблемы с Looper. Кроме того, он удовлетворяет требованиям MVVM «отсутствие кода представления в модели представления».

...