프로그래밍 방식으로 선택한 스피너 항목 설정


384

나는 안드로이드 프로젝트에서 일하고 있으며 데이터베이스에서 채워지는 배열 어댑터를 사용하는 스피너를 사용하고 있습니다.

선택한 항목을 프로그래밍 방식으로 목록에서 설정하는 방법을 찾을 수 없습니다. 예를 들어, 스피너에 다음 항목이있는 경우 :

  • 카테고리 1
  • 카테고리 2
  • 카테고리 3

화면을 만들 때 프로그래밍 방식으로 범주 2를 선택한 항목으로 만드는 방법은 무엇입니까? 나는 그것이 C # IE Spinner.SelectedText = "Category 2"와 비슷할 것이라고 생각했지만 Android에서는 이와 비슷한 방법이없는 것 같습니다.


이 링크를 따라 가십시오 : [스피너 항목에서 선택을 설정하는 방법] [1] [1] : stackoverflow.com/questions/16358563/…
Maddy

1
에 색인을 전달할 수 있습니다 spinner.setSelection(). 그것은 잘 작동합니다. 인덱스를 실제 문자열과 일치시키는 데 도움이되는 메소드를 작성할 수도 있습니다.
Taslim Oseni

답변:


737

다음을 사용하십시오 spinnerObject.setSelection(INDEX_OF_CATEGORY2)..


285
감사합니다.이 작업은 훌륭했지만 어댑터를 반복하지 않고도 인덱스를 얻는 방법을 찾았습니다. 나는 다음을 사용했다mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

85
참조 할 어댑터가없는 경우를 대비하여. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()). getPosition ( "Value"));
Kalel Wade

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

setAdapter () 직후에 SetSelection ()을 호출하면 첫 번째 항목이 항상 표시되는 것처럼 보이며 (Android 2.3) dropView에서 좋은 항목을 선택하더라도 마찬가지입니다. view.post () (@Marco Hernaiz Cao answer)를 추가하면 문제가 해결됩니다.
Christ

3
Spinner에 onItemSelectedListener ()가 있으면 작동하지 않습니다. 리스너가 호출되지 않습니다.
Don Larynx

79

이 답변 중 어느 것도 나에게 해결책을주지 못했습니다.

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

3
setAdapter () 바로 다음에 SetSelection ()을 호출합니다. dropView에서 좋은 항목을 선택하더라도 항상 첫 번째 항목 (Android 2.3)이 표시됩니다. 귀하의 솔루션이 나를 위해했습니다.
Christ

2
고마워요! btw는 ListView.post.run () performItemClick ()에서도 작동합니다.
Michael D.

크기를 기준으로 마지막 것을 어떻게 선택합니까?
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.
Arun George

그는 데이터베이스에서 범주를 채우고 있으며 각 범주에 대한 ID가 있어야합니다.
Yaqub Ahmad

1
왜 이것이 CursorAdapter라고 가정합니까? SpinnerAdapter도 잘 작동합니다.
Greg Ennis

나는 당신이 그것을해야한다, 여기에 실수가 있다고 생각 adapter.getItem(position)하지 adapter.getItemId(position).
Vadim Kotov

29

일부 설명 (적어도 조각에 대해서는 순수한 활동으로 시도하지 마십시오). 누군가 안드로이드를 더 잘 이해하는 데 도움이되기를 바랍니다.

Arun George의 가장 인기있는 답변 은 정확하지만 경우에 따라 작동하지 않습니다. Marco HC
의 답변 은 Runnable을 사용하는 것이 추가 CPU로드로 인한 마지막 수단입니다.

대답은 -setSelection ()을 호출 할 올바른 장소를 선택 해야한다는 것 입니다. 예를 들어 저에게 효과적 입니다.

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

    yourSpinner.setSelection(pos);
 }

그러나 onCreateView ()에서는 작동하지 않습니다 . 나는 이것이이 주제에 관심이있는 이유라고 생각합니다.

비밀은 안드로이드를 사용하면 어떤 방법 으로든 원하는 작업을 수행 할 수 없다는 것입니다. 여기 에 답을 보십시오 )


감사합니다-Fragments에 onResume 방법이 있다는 것을 몰랐습니다.
ToolmakerSteve

귀하의 답변이 @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

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

5

다음과 같이 쉽게 설정할 수 있습니다. spinner.setSelection(1), 1 대신 표시하려는 목록의 위치를 ​​설정할 수 있습니다.


4

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

그게 진짜 방법이라고 생각합니다


1
예, SimpleCursorAdapter의 경우 spinnerRegion.getItemIdAtPosition (i)은 Cursor를 제공하여 열을 가져 오는 데 사용할 수 있습니다.
lalitm

3

이것은 나를 위해 일한 것입니다.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);

+1은 어떻습니까?
SHADOW.NET

0부터 시작하므로 정답을 얻으려면 하나를 추가해야합니다.
Arpit Patel

2

연락처 목록이 있으면 다음과 같이 할 수 있습니다.

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

2

나는 이미 대답했지만 하나의 항목을 선택하는 간단한 코드, 매우 간단하다는 것을 알고 있습니다.

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

2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }

4
답을 설명하기 위해 약간의 텍스트를 추가 할 수 있습니까?
Kmeixner

2

이것은이 페이지의 다른 곳의 의견에 나와 있지만 답변으로 끌어내는 것이 유용하다고 생각했습니다.

어댑터를 사용하는 경우, 나는 것으로 나타났습니다 spinnerObject.setSelection(INDEX_OF_CATEGORY2)요구 사항이 발생 setAdapter 전화; 그렇지 않으면 첫 번째 항목은 항상 초기 선택입니다.

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

이는에 대한 AbsSpinner 코드 를 검토하여 확인됩니다 setAdapter.


물론, 어댑터가 채워진 후에 만 ​​항목을 선택할 수 있습니다.
CoolMind

2

이것이 Kotlin에서 사용하는 것입니다.

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.