442

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

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

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

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

4

25 に答える 25

852

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

于 2012-06-17T15:41:29.997 に答える
94

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

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
于 2014-02-23T18:08:42.157 に答える
43
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);
于 2012-06-17T15:44:10.480 に答える
34

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

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

答えは-setSelection()を呼び出す正しい場所を選択するだけです。たとえば、私にとってはうまくいきます。

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

    yourSpinner.setSelection(pos);
 }

ただし、onCreateView()では機能しません。それがこのトピックに興味を持った理由だと思います。

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

于 2014-08-14T18:45:39.870 に答える
17

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

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;
        }
    }
}
于 2015-10-14T13:35:26.450 に答える
15

DBの値を使用して、それらをArrayListに格納してから、次を使用してみませんか。

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
于 2014-08-08T14:18:53.083 に答える
11

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

    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"));
于 2018-03-29T18:57:24.490 に答える
7

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);
        }
    }
}
于 2015-03-12T09:43:36.590 に答える
6

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

于 2017-04-10T19:41:35.077 に答える
5

SimpleCursorAdapterを使用しているので、この投稿のresposeを使用するためにデータを複製する必要があります。したがって、この方法を試すことをお勧めします。

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

それが本当の方法だと思います

于 2013-06-25T19:18:05.233 に答える
3

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

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
于 2016-03-22T22:00:51.007 に答える
3

これは私にとっての仕事です。

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
于 2016-07-21T10:01:07.370 に答える
3

これは私がKotlinで使用しているものです:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
于 2019-03-25T13:51:40.280 に答える
3

Kotlinで、ラムダを使用した簡単なソリューションを見つけました。

spinnerObjec.post {spinnerObjec.setSelection(yourIndex)}
于 2021-11-21T19:23:00.190 に答える
2

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

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
于 2014-07-30T15:10:26.190 に答える
2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
于 2016-04-28T17:01:07.647 に答える
2

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

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

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

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

于 2018-07-18T10:53:20.417 に答える
1

これが私が使用しているKotlin拡張機能です:

fun Spinner.setItem(list: Array<CharSequence>, value: String) {
    val index = list.indexOf(value)
    this.post { this.setSelection(index) }
}

使用法:

spinnerPressure.setItem(resources.getTextArray(R.array.array_pressure), pressureUnit)
于 2020-10-12T17:06:14.583 に答える
1

はい、これは、スピナーのsetSelection関数で目的のスピナーアイテムのインデックスを渡すことで実現できます。例えば:

spinnerObject.setSelection(INDEX_OF_CATEGORY)。

于 2021-09-22T11:17:31.483 に答える
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;
        }
    }
}
于 2016-11-22T16:23:05.443 に答える
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);
  }
});
于 2019-02-21T00:16:43.843 に答える
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
}
于 2019-07-04T14:10:39.550 に答える
0

これは私のために働いた:

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

        spinnerAdapter.notifyDataSetChanged();
    }
});
于 2021-09-22T10:20:21.880 に答える
-1

これは私のために働いた:

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

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

于 2017-08-05T03:20:27.773 に答える
-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;
    }
于 2019-05-29T09:23:20.983 に答える