【发布时间】:2012-10-07 14:11:06
【问题描述】:
部分用户报告此错误:
java.lang.NullPointerException
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:291)
at android.widget.AutoCompleteTextView$PopupDataSetObserver$1.run(AutoCompleteTextView.java:1670)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
这是我的代码 sn-p:
private List<City> autoCompleteCities = new ArrayList<City>();
private List<City> autoCompleteCitiesOld = new ArrayList<City>();
private ArrayAdapter<String> autoCompleteAdapter;
private AutoCompleteTextView cityView;
...
autoCompleteAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
autoCompleteAdapter.setNotifyOnChange(true);
cityView = (AutoCompleteTextView) findViewById(R.id.city);
cityView.setAdapter(autoCompleteAdapter);
cityView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
LogUtil.i("!!!!!!!!!!!!! ontextchanged", s.toString());
autoCompleteAdapter.clear();
autoCompleteCitiesOld = autoCompleteCities;
if (s.toString().length() > 2) {
autoCompleteCities = search(s.toString());
for (City city : autoCompleteCities) {
autoCompleteAdapter.add(city.getDisplayName());
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
这不会发生在我身上,但我有足够的错误报告知道它发生在几个用户身上。知道有什么问题吗?为什么只有少数用户会发生这种情况?
我发现了这个post,但是将新的自动完成值的获取放在 AsyncTask 中意味着结果总是比用户输入的内容晚一个字符。
【问题讨论】:
-
如果支持适配器的列表数据在某个时刻变为空,则会发生该异常。当适配器第一次初始化时(即使它只使用代码中的布局文件完成),一个空列表被分配,所以你必须稍后做一些事情,使列表
null(如果你只使用@ 987654325@ 不应该发生的方法)。此外,您对AutoCompleteTextView(修改适配器的方式)的使用也不是正确的方式。 -
正确的方法是什么?除了上面代码中显示的内容之外,我没有对 autoCompleteAdapter 的引用...
-
正确的方法是通过在适配器中实现自己的过滤器来自动完成(因为
AutocompleteTextView正在使用过滤器来获取建议)。如果值(或城市)的完整列表在搜索之间没有修改,那么每次用户修改AutoCompleteTextView中的文本时重新设置适配器的数据是没有意义的。 -
如果我一次将所有城市添加到适配器然后过滤它们,因为有大约 100,000 个城市,所以需要很长时间。这就是为什么它需要动态更新...
-
我不是说要一次添加所有城市(因为
AutoCompleteTextview只有在您插入字符时才会显示建议(这实际上调用了适配器的getFilter方法)) ,您只需要移动您当前在自定义适配器的Filter实现中所做的事情(您还可以获得一个后台线程,因此没有任何问题)。
标签: android autocompletetextview