私はAndroidプロジェクトに取り組んでいます、そして私はデータベースから作成された配列アダプターを使うスピナーを使っています。
リストから選択した項目をプログラムで設定する方法がわかりません。たとえば、スピナーに次のようなものがあるとします。
画面が作成されたときにプログラムでカテゴリ2を選択項目にするにはどうすればよいですか。 c#I.E Spinner.SelectedText = "Category 2"に似ているのではないかと考えていましたが、Androidにはこれに似た方法はないようです。
以下を使用してください:spinnerObject.setSelection(INDEX_OF_CATEGORY2)
。
これらの答えのどれも私に解決策を与えませんでした、これでのみ働いていました:
mySpinner.post(new Runnable() {
@Override
public void run() {
mySpinner.setSelection(position);
}
});
public static void selectSpinnerItemByValue(Spinner spnr, long value) {
SimpleCursorAdapter adapter = (SimpleCursorAdapter) spnr.getAdapter();
for (int position = 0; position < adapter.getCount(); position++) {
if(adapter.getItemId(position) == value) {
spnr.setSelection(position);
return;
}
}
}
あなたは上記のように使用することができます:
selectSpinnerItemByValue(spinnerObject, desiredValue);
もちろん、インデックスで直接選択することもできます。
spinnerObject.setSelection(index);
いくつかの説明(少なくともフラグメント用 - 純粋なアクティビティで試したことがない)。誰かがAndroidをよりよく理解できるようになることを願っています。
Arun George による最も一般的な回答は正しいですが、場合によっては機能しません。
[ - 。] Marco HC による回答はRunnableを使用していますが、追加のCPU負荷があるためです。
答えは - あなたは単に setSelection() を呼び出すための正しい場所を選ぶべきです - 例えば、私の場合は works です:
@Override
public void onResume() {
super.onResume();
yourSpinner.setSelection(pos);
}
しかしonCreateView()では動作しません 。それがこのトピックに興味を持っている理由だと思います。
秘密は、Androidではどの方法でも望みどおりのことができないということです - oops :( - コンポーネントの準備ができていない可能性があります。他の例としては、ScrollViewをonCreateView()でもonResume()でもスクロールできません(答えを見なさい ここ )
DBから自分の値を使用してそれらをArrayListに格納してから、単に次のように使用してはどうでしょうか。
yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
値を見つけて選択するには:
private void selectValue(Spinner spinner, Object value) {
for (int i = 0; i < spinner.getCount(); i++) {
if (spinner.getItemAtPosition(i).equals(value)) {
spinner.setSelection(i);
break;
}
}
}
私のUtilityClassで行っているように、この種の作業のための一般的な方法を作ることができます。
public void SetSpinnerSelection(Spinner spinner,String[] array,String text) {
for(int i=0;i<array.length;i++) {
if(array[i].equals(text)) {
spinner.setSelection(i);
}
}
}
最適な解決策は次のとおりです。
public String[] items= new String[]{"item1","item2","item3"};
// here you can use array or list
ArrayAdapter adapter= new ArrayAdapter(Your_Context, R.layout.support_simple_spinner_dropdown_item, items);
final Spinner itemsSpinner= (Spinner) findViewById(R.id.itemSpinner);
itemsSpinner.setAdapter(adapter);
アイテムの位置を取得するには、次の文を自動的に追加します。
itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
SimpleCursorAdapterがあるので、この投稿の応答を使用するためにデータを複製する必要があります。したがって、この方法を試してみることをお勧めします。
for (int i = 0; i < spinnerRegion.getAdapter().getCount(); i++) {
if (spinnerRegion.getItemIdAtPosition(i) == Integer
.valueOf(signal.getInt(signal
.getColumnIndexOrThrow("id_region")))) {
spinnerRegion.setSelection(i);
break;
}
}
それは本当の方法だと思う
1の代わりにspinner.setSelection(1)のように簡単に設定できます。表示したいリストの任意の位置を設定できます。
これは私の仕事です。
spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
あなたが連絡先のリストを持っているなら、あなたはこれのために行くことができます:
((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
私の場合、このコードは私の日を節約しました:
public static void selectSpinnerItemByValue(Spinner spnr, long value) {
SpinnerAdapter adapter = spnr.getAdapter();
for (int position = 0; position < adapter.getCount(); position++) {
if(adapter.getItemId(position) == value) {
spnr.setSelection(position);
return;
}
}
}
私はそれがすでに答えられているのを知っています、しかし1つのアイテムを選ぶための単純なコード、非常に単純な:
spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
spRaca.setSelection(x);
break;
}
}
これが私がKotlinで使っていることです:
spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
データのロードとアイテム選択の追跡のために、Spinner
の拡張関数を作成しました。
Spinner.kt
fun <T> Spinner.load(context: Context, items: List<T>, item: T? = null) {
adapter = ArrayAdapter(context, Android.R.layout.simple_spinner_item, items).apply {
setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item)
}
if (item != null && items.isNotEmpty()) setSelection(items.indexOf(item))
}
inline fun Spinner.onItemSelected(
crossinline itemSelected: (
parent: AdapterView<*>,
view: View,
position: Int,
id: Long
) -> Unit
) {
onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
itemSelected.invoke(parent, view, position, id)
}
}
}
使用例
val list = listOf("String 1", "String 2", "String 3")
val defaultData = "String 2"
// load data to spinner
your_spinner.load(context, list, defaultData)
// load data without default selection, it points to first item
your_spinner.load(context, list)
// for watching item selection
your_spinner.onItemSelected { parent, view, position, id ->
// do on item selection
}
ほとんどの場合spinner.setSelection(i); //i is 0 to (size-1) of adapter's size
は機能しません。 spinner.setSelection(i);
を呼び出しただけの場合
それはあなたの論理次第です。
ビューが完全にロードされていて、あなたがインターフェースからそれを呼びたいのであれば、私はあなたが呼ぶことを勧めます
spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size
あるいは、アクティビティ/フラグメントのライフサイクルを切り替えたい場合は、次のようにしてください。
spinner.post(new Runnable() {
@Override public void run() {
spinner.setSelection(i);
}
});
これは、このページの他の場所にあるコメントに記載されていますが、答えに引き出すのに便利だと思いました。
アダプタを使うとき、spinnerObject.setSelection(INDEX_OF_CATEGORY2)
はaftersetAdapter
の呼び出しが必要です;そうでなければ、最初の項目が常に最初の選択になります。
// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);
これはsetAdapter
のAbsSpinner code を確認することで確認できます。