代码之家  ›  专栏  ›  技术社区  ›  Brian

我想不出怎么过去活套准备()尝试使用自定义Android ArrayAdapter时出错

  •  0
  • Brian  · 技术社区  · 7 年前

    我创建了一个自定义 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);
        }
    }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Brian    7 年前

    所以。。。我解决了这个问题。在一位同事的建议下,我将自定义ArrayAdapter的创建移到了我的视图片段中:

    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);
    

    这解决了我所有的活套问题。另外,它满足MVVM的“视图模型中没有视图代码”的要求。

    推荐文章