7

私はスピナーでビューを持っています。アクティビティは、親がスピナーに表示する値を追加または削除するポップアップで別のアクティビティを開始します。そのため、onActivityResult() では、fillSpinner() メソッドを呼び出して、Spinner のコンテンツを更新し、追加または削除された値が反映されるようにします。このメソッドのパラメーターは、以前に選択した値です。

private void fillSpinner(String value){

    Cursor c =  mDbHelper.getAllCategories();
    startManagingCursor(c);
    c.moveToFirst();

    String[] from = new String[]{DBAdapter.KEY_CATEGORY};       
    SimpleCursorAdapter scCats = new SimpleCursorAdapter(
        this, android.R.layout.simple_spinner_item,c,from,
            new int[]{android.R.id.text1});
    scCats.setDropDownViewResource(
        android.R.layout.simple_spinner_dropdown_item);
    category.setAdapter(scCats);

    if (value != null && value != "") {
        category.setSelection((int)mDbHelper.categoryIndex(value));
    }
}

スピナーを開くと、正しいリストが含まれており (つまり、更新されています)、正しい値が選択されています。ただし、Spinner コントロール自体 (閉じた状態) には、選択された値は表示されませんが、リストの最初の値が表示されます。

デバッガーでコードをステップ実行すると、setSelection() を呼び出す前後で Spinner の値が正しくなります (常に同じ正しい ID で呼び出されます)。ただし、イベントから抜け出せないので、しばらくしてから実行を再開すると、スピナーの値が変化します。

つまり、ポップアップ アクティビティから戻ると、スピナーの表示文字列が変更され、選択した項目とは異なります。

どんなアイデアでも大歓迎です。

4

2 に答える 2

5

その問題に対する簡単な解決策を見つけました。フォーム Spinner.setSelection(int position, Boolean NavigateTo) を使用して、スピナーに正しい選択項目を表示させます。

例: Spin.setSelection(iPos, true);

幸運を。

于 2012-03-19T23:21:14.597 に答える
1

問題は、呼び出しごとにカーソルが再作成されたためだと思います。これ以上の説明はありません。この投稿は、間接的に私を正しい方向に向けました。

最初にカーソルを作成した後にカーソルを保持することで、質問のメソッドを実行するのではなく、リスト データを変更した後に requery() を呼び出すことができました。今はうまくいきます。

于 2010-07-04T03:53:31.843 に答える