动态AutoCompleteTextView上的NullPointerException

时间:2012-10-07 14:11:06

标签: android autocompletetextview

有些用户报告此错误:

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中获取新的自动完成值意味着结果总是落后于用户输入的一个字符。

5 个答案:

答案 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);
        }
    }
}