Spinnerの中でアイテムのpositionを取得する

Spinnerの選択肢を手動で変更する場合、以下のようにsetSelectionで引数にSpinner中のアイテムのpositionを指定します。

// spinnerの先頭を選択
spinner.setSelection(0)

問題はこのpositionをどうやって調べるかです。Spinnerから特定の文字列に合致するアイテムのpositionを得たいと思った場合、SpinnerにはgetChildAtというメソッドがあるので以下のようなコードを書きたくなりますが、これはうまくいきません。

for(index <- 0 until spinner.getChildCount) {
if (value == spinner.getChildAt(index).getTag.asInstanceOf[String]) {
spinner.setSelection(index)
}
}

実行してみると分かりますが、spinnerのgetChildAtとgetChildCountは現在選択されているアイテム1つしか取得できません。SpinnerにはAdapter経由でアイテムを複数設定していても、getChildCountを実行すると1が返ってきます。

Spinner中のアイテムのpositionを取得するにはAdapterを調べる必要があります。以下はCursorAdapterの例です。

def getPositionOf(categoryId: String, cursor: Cursor): Int = {
while(cursor.moveToNext()) {
val id = cursor.getString(cursor.getColumnIndex("category_id"))
if (id == categoryId) return cursor.getPosition
}
-1
}

val pos = getPositionOf("category1", spinner.getAdapter.asInstanceOf[CursorAdapter].getCursor)
if (pos >= 0) {
spinner.setSelection(pos)
}

CursorAdapterのCursorの値を順番に調べ、合致する値が見つかったらその時のcursorのpositionの値をspinnerのsetSelectionの引数にセットしています。