プログラムでスピナーの選択されたアイテムを設定する


384

私はAndroidプロジェクトに取り組んでおり、データベースから読み込まれた配列アダプターを使用するスピナーを使用しています。

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

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

画面の作成時に、プログラムでカテゴリ2を選択したアイテムにする方法を教えてください。私はそれがc#IE Spinner.SelectedText = "Category 2"に似ているかもしれないと思っていましたが、Androidにはこれに似たメソッドはないようです。


このリンクに従ってください:[どのようにスピナー項目のセットの選択へ] [1] [1]:stackoverflow.com/questions/16358563/...
マディ

1
インデックスをに渡すことができますspinner.setSelection()。それはうまくいきます。インデックスを実際の文字列に一致させるのに役立つメソッドを作成することもできます。
Taslim Oseni

回答:


737

次を使用します spinnerObject.setSelection(INDEX_OF_CATEGORY2)


287
おかげで、これはうまくいきましたが、これを行っている間、アダプタをループする必要なくインデックスを取得する方法も見つけました。私は次を使用しましたmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

86
参照するアダプターがない場合。mySpinner.setSelection(((ArrayAdapter)mySpinner.getAdapter())。getPosition( "Value"));
Kalel Wade 14

3
sexSpinner.setSelection(adapter.getPosition(mUser.getGender())== -1?0:adapter.getPosition(mUser.getGender()));
Goofyahead 2014年

setAdapter()の直後にSetSelection()を呼び出すと、最初の項目が常に表示されるように見えます(Android 2.3)。dropViewで適切な項目が選択されている場合でも同様です。view.post()(@Marco Hernaiz Caoの回答)を追加して修正してください。
キリスト

3
これは、SpinnerにonItemSelectedListener()がある場合は機能しません。リスナーは呼び出されません。
Don Larynx、2015年

80

これらの答えのどれも私に解決策を与えず、これでのみ機能しました:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});

3
setAdapter()の直後にSetSelection()を呼び出します。これにより、最初のアイテムが常に表示されます(Android 2.3)。dropViewで適切なアイテムが選択されている場合でも同様です。あなたの解決策は私のためにそれをしました。
キリスト

2
ありがとう、うまくいきました!btwはListView.post.run()performItemClick()でも機能します
Michael D. 14

サイズに基づいて最後の1つを選択するにはどうすればよいですか?
jvargas

41
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);

このコードのエラーは、@ Boardy Category 2が私が文字列であると想定する選択が必要であることです(彼がを使用してみたと仮定した場合Spinner.SelectedText = "Category 2")が、上記のコードはlong
アルンジョージ

彼はデータベースからカテゴリを作成しています。各カテゴリにはIDが必要です。
Yaqub Ahmad

1
なぜそれがCursorAdapterであると想定するのですか?SpinnerAdapterも同様に機能します。
グレッグエニス2013

ここに間違いがあると思いますが、それは間違いではありadapter.getItem(position)ませんadapter.getItemId(position)
Vadim Kotov

29

いくつかの説明(少なくともフラグメントの場合-純粋なアクティビティで試したことがない)。Androidについて理解を深めるのに役立つことを願っています。

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

答えは-あなたは、単に必要があるsetSelection()を呼び出すための正しい場所を選択し、例えばそれは働く私のために:

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

    yourSpinner.setSelection(pos);
 }

ただし、onCreateView()では機能しません。それがこの話題に興味を持つ理由だと思います。

秘密は、Androidでは、どのメソッドでも必要なことは何もできないということです-oops :(-コンポーネントは準備ができていない可能性があります。別の例として、onCreateView()でもonResume()でもScrollViewをスクロールすることはできません。ここで答えを見てください


ありがとう-FragmentsにonResumeメソッドがあることを知りませんでした。
ToolmakerSteve、2014

あなたの答えが@Marco HCより上になるように、私は+18を与えることができます。あなたは、物事に行われることを意図されている方法をやろうとしているだけです
vedant

15

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

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

12

DBからの値を使用してArrayListに保存し、次のように使用しないでください。

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

1
DataAdapterを使用するさまざまなソリューションは私には機能しませんでしたが、このサンプルで値が作成されたArrayListを使用することでうまくいきました。
ewall、

8

最適なソリューションは次のとおりです。

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

7

この種の作業のためのジェネリックメソッドを作成することができます。

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

5

次のように簡単に設定できますspinner.setSelection(1)。1ではなく、表示するリストの任意の位置を設定できます。


4

SimpleCursorAdapterがあるので、この投稿でreposeを使用するにはデータを複製する必要があります。だから、私はあなたがこの方法を試すことをお勧めします:

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
はい、SimpleCursorAdapterの場合、spinnerRegion.getItemIdAtPosition(i)は、列を取得するために使用できるCursorを提供します。
lalitm 2014年


2

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

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

2

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

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );


2

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

アダプターを使用しているとき、呼び出しのspinnerObject.setSelection(INDEX_OF_CATEGORY2)に発生する必要があることがわかりました。それ以外の場合、最初の項目は常に最初の選択です。setAdapter

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

これは、のAbsSpinner コードを確認することで確認されますsetAdapter


もちろん、アダプタが満たされた後でないと、アイテムを選択できません。
CoolMind 2018

2

これは私がコトリンで使用するものです:

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

indexOf一致しない場合はを返します-1。これにより、デフォルト値がによって選択されているように見えますspinner.setSelection。私はそれで大丈夫です。
lasec0203

0

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

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

これを行う必要はありません。アダプターには、int位置を返すgetPosition(item)呼び出しがあります。
tzg

0

ほとんどの場合、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

私はいくつかの拡張機能を作りました 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
}

-1

これは私のために働きました:

@Override
protected void onStart() {
    super.onStart();
    mySpinner.setSelection(position);
}

@sberezinのソリューションに似ていますが、onStart()でsetSelection()を呼び出します。


-1

昨日から同じ問題が発生しました。残念ながら、配列リストの最初の項目はデフォルトでスピナーウィジェットに表示されます。ターンアラウンドは、配列リストの各要素を持つ以前に選択された項目を見つけ、その位置を最初の要素と交換することです。これがコードです。

OnResume()
{
int before_index = ShowLastSelectedElement();
if (isFound){
      Collections.swap(yourArrayList,before_index,0);
   }
adapter = new ArrayAdapter<String>(CurrentActivity.this,
                            android.R.layout.simple_spinner_item, yourArrayList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;                    yourListView.setAdapter(adapter);
}
...
private int ShowLastSelectedElement() {
        String strName = "";
        int swap_index = 0;
        for (int i=0;i<societies.size();i++){
            strName = yourArrayList.get(i);
            if (strName.trim().toLowerCase().equals(lastselectedelement.trim().toLowerCase())){
                swap_index = i;
                isFound = true;
            }
        }
        return swap_index;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.