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 に入れると、結果は常にユーザーが入力した文字より 1 文字遅れます。

4

5 に答える 5

1

ArrayList を ArrayAdapter に渡す場所はどこですか。ArrayAdapter でリストの長さをカウントしているときに NullPointerException がスローされます。ただし、リストはアダプタに渡されないため、デフォルトのアダプタのリスト オブジェクトには null が含まれます。

于 2012-10-07T14:17:22.677 に答える
0

私は同じ問題でまったく同じ問題を抱えていました。私の場合、リストに動的に追加したりリストから削除したりする通りが何千もあります。私の場合、オートコンプリートフィールドに値を入力すると(しきい値が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);
        }
    }
}
于 2013-01-18T15:28:49.393 に答える
0

以下のようなオブジェクトを使用する前にnullチェックを行い、検索機能でもそれを行うことをお勧めします..

 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 に答える
0

どこに String の配列を追加したのか、エラーの理由は空の配列リストである可能性があります: autoCompleteAdapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line);

ここでは、文字列配列を割り当てていません

そして、あなたの完全なコードを入力してください。人々が問題を理解するのに大いに役立ちます

于 2013-01-18T04:29:36.393 に答える
0

私の仮説は、アクティビティの再作成後に null になる静的変数を使用している場所にいるということです。ここで私の答えを参照してください:パブリック静的変数と Android アクティビティのライフサイクル管理

Android v.4エミュレーターを作成し、開発者の設定に移動し、バックグラウンドタスクを無効にし、複数のアクティビティを無効にしてから、アプリケーションを使用してみてください-失敗する可能性があります.

于 2013-01-17T22:14:06.623 に答える