2012-08-24 21 views
5

私はdbから取り出されるCategoryのオブジェクトで構成されたスピナーを持っています。 Categoriesテーブルには_idcategory_nameのカラムがあります。スピナーにカテゴリ名を表示したいのですが、ユーザーがアイテムを選択すると、選択したアイテムのIDを取得する必要があります。 onCreate方法でそれらをインスタンス化ダイナミックスピナーで選択したアイテムのIDを取得する方法は?

int currCategoryId; 

ArrayAdapter<String> adapter; 

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

Spinner spCategories; 

宣言(クラスレベルでの)変数:私は次のことを試してみました

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) {  

     }     
    }; 

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

Stringこの行で「カテゴリーにキャストすることはできません。Category selectedCategory = (Category)spCategories.getItemAtPosition(pos);

また、私はこの試みた:

currCategoryId = view.getId(); 

をしかし、その後の代わりに、1または2(私が選択したものをカテゴリに応じて、現在は2つあります)、非常に長い番号を取得しています...

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

+0

try parent.getAdapter.getItem();あなたの希望するクラスにこのアイテムをキャストして、私はこれが動作することを願って –

+0

@AdeelPervaizいいえ、動作しませんでした - getAdapterメソッドはありません... – Igal

答えて

4

とにかくArrayAdapterを使用することはできません。これは、文字列のみ(カテゴリではないため)のためです。したがって、キャスティングの例外が発生するのはなぜですか。あなたはそれが複数の列を格納するため、私はSimpleCursorAdapterを使用することになり、あなたのonItemSelected()方法

+0

はい、それは働いた! 'category selectedCategory =(Category)parent.getItemAtPosition(pos);'という行を使ってみましたが、明らかにそれはうまくいきませんでした。私は今私の間違いを見る。どうもありがとうございました! – Igal

5

Category selectedCategory = arrListCategories.get(pos); 

を使用し、同じ順序であなたのカテゴリーArrayListと(ArrayAdapterのために使用されている)あなたの文字列ArrayListを持っているので、 1つだけを格納するArrayAdapterではなく、あなたがしたい場合

"SELECT _id, category_name FROM Table;" 

あなたは結果をアルファベット順に並べることもできます:

まず変更NotesManager.getAllCategories()が使用するCursorを返すために

"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()通話または必要なリストにカーソルを変換します!

関連する問題