3

一些用户报告此错误:

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

它不会发生在我身上,但我有足够的错误报告知道它发生在几个用户身上。知道有什么问题吗?为什么这种情况只发生在少数用户身上?

我找到了这篇文章,但是将新的自动完成值的获取放在 AsyncTask 中意味着结果总是落后于用户输入的一个字符。

4

5 回答 5

1

你在哪里将 ArrayList 传递给 ArrayAdapter。NullPointerException 在计算 ArrayAdapter 中的列表长度时抛出。但是列表并没有传递给Adapter,所以默认Adapter中的列表对象包含null。

于 2012-10-07T14:17:22.677 回答
0

我的假设是,您在某处使用静态变量,这些变量在活动重新创建后无效。在这里查看我的答案:公共静态变量和 Android 活动生命周期管理

创建 android v.4 模拟器,转到开发人员设置,禁用后台任务,禁用多个活动,然后尝试使用您的应用程序 - 它可能会失败。

于 2013-01-17T22:14:06.623 回答
0

I had exactly the same problem with the same issue. In my case I have thousands of streets I dynamically add and remove from the list. In my case it was always reproducable when I enter some value into the AutoComplete field, let's say 3 characters (while threshold is set to 0), so the dropdown list appears, and then I delete those characters by delete button very quickly. That means I hit the delete button a lot of times. It always crashes then. I figured out that clear causes the crashes. I put the clear in beforeTextChanged and the crashes were gone:

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);
        }
    }
}
于 2013-01-18T15:28:49.393 回答
0

你在哪里添加了 String 的数组,错误的原因可能是空数组列表为: autoCompleteAdapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line);

在这里你没有分配任何字符串数组

并输入您的完整代码,这将有助于人们理解问题

于 2013-01-18T04:29:36.393 回答
0

最好在使用如下对象之前进行空检查,并在搜索功能中进行检查..

 if (s.toString().length() > 2) {
     autoCompleteCities = search(s.toString());
     if(autoCompeleteCities!=null){     
         for (City city : autoCompleteCities) {
              autoCompleteAdapter.add(city.getDisplayName());
         }
       }

于 2013-01-18T09:06:57.610 回答