5

Categoryデータベースから取得したオブジェクトが入力されたスピナーがあります。カテゴリテーブルには列が_idありcategory_nameます。スピナーにカテゴリ名を表示したいのですが、ユーザーがアイテムを選択したときに、選択したアイテムのIDを取得するために必要です。私は次のことを試しました:

変数の宣言(クラスレベルで):

int currCategoryId;

ArrayAdapter<String> adapter;

NotesManager manager = new NotesManager(this);
ArrayList<Category> arrListCategories; 
ArrayList<String> arrListCategoriesString = new ArrayList<String>();

Spinner spCategories;

メソッドでそれらをインスタンス化するonCreate

manager.getAllCategories();
    arrListCategories = manager.getAllCategories();

    for (int i = 0; i < arrListCategories.size(); i++) 
    {
        Category currCategory = arrListCategories.get(i);
        arrListCategoriesString.add(currCategory.getCategory_name().toString());            
    }

    adapter=new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, arrListCategoriesString);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spCategories.setAdapter(adapter);
    spCategories.setOnItemSelectedListener(spinnerListener);

そしてこれは私が試したspinnerListenerです:

OnItemSelectedListener spinnerListener = new OnItemSelectedListener() 
    {       
        public void onItemSelected(AdapterView<?> parent, View view, 
                int pos, long id) {
            // An item was selected.
            //currCategory = (String) parent.getItemAtPosition(pos).toString(); 
            //selectedCategory = 
            Category selectedCategory = (Category)spCategories.getItemAtPosition(pos);
            currCategoryId = selectedCategory.getId();

        }

        public void onNothingSelected(AdapterView<?> arg0) {    

        }                   
    };

しかし、この場合、アプリがクラッシュし、「

次の行では、文字列を「カテゴリ」にキャストできません。Category selectedCategory = (Category)spCategories.getItemAtPosition(pos);

私もこれを試しました:

currCategoryId = view.getId();

しかし、1つまたは2つではなく(選択したカテゴリに応じて、現在2つあります)、非常に長い数になります...

どうすれば修正できますか?選択したオブジェクトのIDを取得するにはどうすればよいですか?

4

2 に答える 2

5

1つだけを格納SimpleCursorAdapterするのではなく、複数の列を格納するため、を使用します。ArrayAdapter

NotesManager.getAllCategories()以下を使用するを返すための最初の変更Cursor

"SELECT _id, category_name FROM Table;"

必要に応じて、結果をアルファベット順に並べることができます。

"SELECT _id, category_name FROM Table ORDER BY category_name;"

次に、これをスピナーに直接バインドCursorします。

Cursor cursor = manager.getAllCategories();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursor, new String[] {"category_name"}, new int[] {android.R.id.text1});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spCategories.setAdapter(adapter);

最後に、OnItemSelectedListenerすべての準備が整い、待機しています。

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    // The parameter id already refers to your Category table's id column, 
}

追加のget()呼び出しやカーソルのリストへの変換は必要ありません!

于 2012-08-24T16:44:26.947 に答える
4

ArrayAdapter文字列専用(カテゴリではない)なので、とにかく使用できません。したがって、キャスト例外が発生するのはなぜですか。カテゴリArrayListと文字列ArrayList(に使用されるArrayAdapter)は同じ順序であるため、次を使用するだけです。

Category selectedCategory = arrListCategories.get(pos);

あなたのonItemSelected()方法で

于 2012-08-24T16:38:09.327 に答える