有些用户报告此错误:
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)
这是我的代码段:
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中获取新的自动完成值意味着结果总是落后于用户输入的一个字符。
答案 0 :(得分:1)
您将ArrayList传递给ArrayAdapter的位置。在计算ArrayAdapter中的列表长度时抛出NullPointerException。但是列表没有传递给Adapter,因此默认Adapter中的列表对象包含null。
答案 1 :(得分:0)
我的假设是你在某个地方使用静态变量,这些变量在活动重建后被取消。 请在此处查看我的回答:Public static variables and Android activity life cycle management
创建android v.4模拟器,转到开发人员的设置,禁用后台任务,禁用多个活动,然后尝试使用你的应用程序 - 它可能会失败。
答案 2 :(得分:0)
你在哪里添加了String数组,错误的原因可能是空数组列表 如: autoCompleteAdapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line);
这里你有没有分配任何字符串数组
输入您的完整代码,这将有助于人们了解问题
答案 3 :(得分:0)
最好在使用下面的对象之前进行空检查,并在搜索功能中进行。
if (s.toString().length() > 2) {
autoCompleteCities = search(s.toString());
if(autoCompeleteCities!=null){
for (City city : autoCompleteCities) {
autoCompleteAdapter.add(city.getDisplayName());
}
}
if (s.toString().length() > 2) {
autoCompleteCities = search(s.toString());
if(autoCompeleteCities!=null){
for (City city : autoCompleteCities) {
autoCompleteAdapter.add(city.getDisplayName());
}
}
答案 4 :(得分:0)
我在同一个问题上遇到了完全相同的问题。在我的情况下,我有成千上万的街道,我从列表中动态添加和删除。 在我的情况下,当我在AutoComplete字段中输入一些值时,它总是可重现的,让我们说3个字符(当阈值设置为0时),因此显示下拉列表,然后我通过删除按钮删除这些字符很快。这意味着我多次点击删除按钮。它总是崩溃。我发现明确导致崩溃。我把明确放在了BeforeTextChanged之后,崩溃就消失了:
public class StreetTextWatcher implements TextWatcher {
private final StreetArrayAdapter adapter;
private boolean alreadyAdded = false;
public StreetTextWatcher(StreetArrayAdapter adapter) {
this.adapter = adapter;
}
@Override
public void afterTextChanged(Editable s) {
//not used
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (s.length() < 1) {
adapter.clear();
alreadyAdded = false;
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 1) {
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("a") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_A);
alreadyAdded = true;
}
if (s.toString().toLowerCase(Locale.GERMAN).startsWith("b") && !alreadyAdded) {
adapter.addAll(StreetNames.STREETS_B);
alreadyAdded = true;
}
//more streets...
}
}
}
<强> StreetArrayAdapter:强>
public class StreetArrayAdapter extends ArrayAdapter<String> {
public StreetArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public void addAll(String[] streets) {
for (String street : streets) {
add(street);
}
}
}