0

私の最初の投稿は私のテキストの半分以下しかなかったので、2番目の(完全な)投稿です。

私は sqlite を使用して 2 つの AutoCompleteTextView を設定するテスト アプリに取り組んでいます。テスト用に車のメーカーとモデルを使用しています。

オートコンプリート:

makeオートコンプリート

モデルオートコンプリート

makeAutocomplete のリストは SQL クエリから取り込まれ、正常に動作します

2 つ目は、make が選択されたときに入力されます

makeAutoComplete.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

            final String[] makeSelected = {arg0.getItemAtPosition(arg2).toString()};
            final String[] modelDeal = sqlDBModel.getAllModelFilter(makeSelected);
            ArrayAdapter<String> modelAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_dropdown_item_1line, modelDeal);
            initModelAutoComplete(modelAdapter);

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

initModelAutoComplete 宣言

public void initModelAutoComplete(ArrayAdapter<String> adapter){


    //adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
    modelAutoComplete.setAdapter(adapter);
    modelAutoComplete.setThreshold(1);
    modelAutoComplete.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){
            arg0.getItemAtPosition(arg2);
        }
    });
}

SQLiteModelSearch.getAllModelFilter 宣言

    public String[] getAllModelFilter(String[] vehiclemake){

    if(vehiclemake != null){

        Cursor cursor = this.sqliteDBInstance.query(DB_MAKEMODEL_TABLE,
                                                    new String[]{DB_COLUMN_MAKE, DB_COLUMN_MODEL},
                                                    DB_COLUMN_MAKE+"=?",
                                                    vehiclemake,
                                                    null,
                                                    null,
                                                    null,
                                                    null);


        if( cursor != null){
            String[] str = new String[cursor.getCount()];

            int i = 0;
            while(cursor.moveToNext()){
                str[i] = cursor.getString(cursor.getColumnIndex(DB_COLUMN_MODEL));
                i++;
            }
            return str;
        } else {
            Log.i("vehiclemake = ", "NULL");
            return new String[]{};
        }
    }

    return new String[]{};
}

LogCat

07-31 13:00:19.631: E/AndroidRuntime(1302): android.app.ActivityThread.main(ActivityThread.java:3683)

07-31 13:00:19.631: E/AndroidRuntime(1302): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 07-31 13:00:19.631: E/AndroidRuntime(1302): 致命的な例外: メイン

07-31 13:00:19.631: E/AndroidRuntime(1302): java.lang.NullPointerException

07-31 13:00:19.631: E/AndroidRuntime (1302): com.myapp.sqltest.database.SQLiteModelSearch.getAllModelFilter (SQLiteModelSearch.java:100) で

07-31 13:00:19.631: E/AndroidRuntime (1302): com.myapp.sqltest.activity.addVehicleActivity$2.onItemSelected (addVehicleActivity.java:62) で

07-31 13:00:19.631: E/AndroidRuntime (1302): android.widget.AdapterView.fireOnSelected (AdapterView.java:871) で

07-31 13:00:19.631: E/AndroidRuntime(1302): android.widget.AdapterView.access$200(AdapterView.java:42) で

07-31 13:00:19.631: E/AndroidRuntime(1302): android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837) で

07-31 13:00:19.631: E/AndroidRuntime(1302): android.os.Handler.handleCallback(Handler.java:587) で

07-31 13:00:19.631: E/AndroidRuntime(1302): android.os.Handler.dispatchMessage(Handler.java:92) で

07-31 13:00:19.631: E/AndroidRuntime(1302): android.os.Looper.loop(Looper.java:130)

07-31 13:00:19.631: E/AndroidRuntime(1302): java.lang.reflect.Method.invoke(Method.java:507) で

07-31 13:00:19.631: E/AndroidRuntime(1302): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) で

07-31 13:00:19.631: E/AndroidRuntime (1302): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) で

07-31 13:00:19.631: E/AndroidRuntime(1302): dalvik.system.NativeStart.main(ネイティブ メソッド) で

例外がスローされていることがわかります。

Cursor cursor = this.sqliteDBInstance.query(DB_MAKEMODEL_TABLE,
                                                    new String[]{DB_COLUMN_MAKE, DB_COLUMN_MODEL},
                                                    DB_COLUMN_MAKE+"=?",
                                                    vehiclemake,
                                                    null,
                                                    null,
                                                    null,
                                                    null);

しかし、理由がわからないのですが、関数に入るすべての変数を見てきましたが、どれもnullではありませんか?

4

2 に答える 2

0

ユーザーがドロップダウンリストのアイテムをクリックすると、オートコンプリートはOnItemClickイベントのみをトリガーするため、OnItemSelectedがAutoCompleteTextViewによって呼び出されることはないと思います。

OnItemSelectedListenerコードをOnItemClickListenerに移動してみてください。

添加

SQLiteDatabase.query()は常に有効なカーソルを返します。カーソルのサイズをチェックして、有効かどうかを確認する必要があります。

    if(cursor != null){ // Not applicable

試す:

if(cursor.getCount() > 0)

また、カーソルを文字列配列に変換する必要は特にありません。SimpleCursorAdapterがこの詳細を処理します。しかし、あなたのアプローチも同様に機能します(いくつかの変更があります)。

ヌルポインタ例外

ここでNPEを受け取っている場合:

Cursor cursor = this.sqliteDBInstance.query(...);

次に、単にsqliteDBInstancenullです。どこで初期化しますsqliteDBInstanceか?SQLiteModelSearchにメソッドがありopen()ますか?ある場合はそれを呼び出しましたか?

于 2012-08-01T17:22:16.763 に答える
0

私はそれを理解しました。問題は私が定義したことでした

public AutoCompleteTextView modelAutoComplete;
public AutoCompleteTextView makeAutoComplete;

次に、関数 onCreate で

私は定義しました:

AutoCompleteTextView modelAutoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteModel);
AutoCompleteTextView makeAutoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteModel);

makeAutoComplete と modelAutoComplete の両方が 2 回定義されているため、変数のスコープを見落としていました。1 つはグローバル クラス変数として、もう 1 つはローカル関数変数として定義されています。

グローバル変数は定義されただけで初期化されていないためです。関数 initModelAutoComplete() がグローバル パブリック変数 modelAutoComplete を参照していたため、NPE 例外が発生していました。

于 2012-08-03T23:24:20.743 に答える