web-dev-qa-db-ja.com

プログラムでスピナーの選択項目を設定

私はAndroidプロジェクトに取り組んでいます、そして私はデータベースから作成された配列アダプターを使うスピナーを使っています。

リストから選択した項目をプログラムで設定する方法がわかりません。たとえば、スピナーに次のようなものがあるとします。

  • カテゴリー1
  • カテゴリー2
  • カテゴリー3

画面が作成されたときにプログラムでカテゴリ2を選択項目にするにはどうすればよいですか。 c#I.E Spinner.SelectedText = "Category 2"に似ているのではないかと考えていましたが、Androidにはこれに似た方法はないようです。

327
Boardy

以下を使用してください:spinnerObject.setSelection(INDEX_OF_CATEGORY2)

657
Arun George

これらの答えのどれも私に解決策を与えませんでした、これでのみ働いていました:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
70
Marco HC
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);
33
Yaqub Ahmad

いくつかの説明(少なくともフラグメント用 - 純粋なアクティビティで試したことがない)。誰かがAndroidをよりよく理解できるようになることを願っています。

Arun George による最も一般的な回答は正しいですが、場合によっては機能しません。
[ - 。] Marco HC による回答はRunnableを使用していますが、追加のCPU負荷があるためです。

答えは - あなたは単に setSelection() を呼び出すための正しい場所を選ぶべきです - 例えば、私の場合は works です:

@Override
public void onResume() {
    super.onResume();

    yourSpinner.setSelection(pos);
 }

しかしonCreateView()では動作しません 。それがこのトピックに興味を持っている理由だと思います。

秘密は、Androidではどの方法でも望みどおりのことができないということです - oops :( - コンポーネントの準備ができていない可能性があります。他の例としては、ScrollViewをonCreateView()でもonResume()でもスクロールできません(答えを見なさい ここ

27
sberezin

DBから自分の値を使用してそれらをArrayListに格納してから、単に次のように使用してはどうでしょうか。

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
11
RicardoSousaDev

値を見つけて選択するには:

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;
        }
    }
}
10
Ferran Maylinch

私の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);
        }
    }
}
6
ZygoteInit

最適な解決策は次のとおりです。

    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"));
4

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;
    }
}

それは本当の方法だと思う

3
pazfernando

1の代わりにspinner.setSelection(1)のように簡単に設定できます。表示したいリストの任意の位置を設定できます。

2
user5495260

これは私の仕事です。

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
2
Arpit Patel

あなたが連絡先のリストを持っているなら、あなたはこれのために行くことができます:

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
1
Maddy

私の場合、このコードは私の日を節約しました:

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
Juan Pablo

私はそれがすでに答えられているのを知っています、しかし1つのアイテムを選ぶための単純なコード、非常に単純な:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
1
Dante
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
1

これが私がKotlinで使っていることです:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
0
Donny Rozendal

データのロードとアイテム選択の追跡のために、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
}
0
Sagar Chapagain

ほとんどの場合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);
  }
});
0
Shan Xeeshi

これは、このページの他の場所にあるコメントに記載されていますが、答えに引き出すのに便利だと思いました。

アダプタを使うとき、spinnerObject.setSelection(INDEX_OF_CATEGORY2)aftersetAdapterの呼び出しが必要です;そうでなければ、最初の項目が常に最初の選択になります。

// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);

これはsetAdapterのAbsSpinner code を確認することで確認できます。

0
Andy