programing

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

bestprogram 2023. 7. 16. 13:46

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

저는 안드로이드 프로젝트를 하고 있으며 데이터베이스에서 입력되는 어레이 어댑터를 사용하는 스피너를 사용하고 있습니다.

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

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

화면이 생성될 때 카테고리 2를 선택 항목으로 프로그래밍하려면 어떻게 해야 합니까?C# I.E. 스피너랑 비슷할 것 같아서요.선택된텍스트 = "카테고리 2"이지만 안드로이드용으로 이와 유사한 방법은 없는 것 같습니다.

합니다.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);

일부 설명(적어도 단편에 대해서는 - 순수 활동으로 시도하지 않음).누군가 안드로이드를 더 잘 이해하는 데 도움이 되길 바랍니다.

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

정답은 - setSelection()으로 호출할 올바른 위치를 선택하는 것입니다. 예를 들어, 다음과 같습니다.

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

    yourSpinner.setSelection(pos);
 }

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

비밀은 Android에서는 어떤 방법으로도 원하는 것을 할 수 없다는 것입니다 - 웁스:( - 구성 요소가 준비되지 않았을 수 있습니다.다른 예로 - CreateView() 또는 Resume()에서 ScrollView를 스크롤할 수 없습니다(여기 답변 참조).

값을 찾아 선택하는 방법

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

DB의 값을 사용하여 ArrayList에 저장한 후 다음을 사용하는 것이 어떻습니까?

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

최적의 솔루션은 다음과 같습니다.

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

당신은 나의 유틸리티 클래스에서 하는 것처럼 이러한 종류의 작업을 위한 일반적인 방법을 만들 수 있습니다.

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

쉽게 할 수 spinner.setSelection(1)할 수 있습니다.1 신대표시목모록위설수있다정습니할를치든의할.

코틀린에서 람다를 사용한 간단한 솔루션을 찾았습니다.

spinnerObjec.post {spinnerObjec.setSelection(yourIndex)}

저는 간단한 커서 어댑터를 가지고 있어서 이 게시물의 응답을 사용하기 위해 데이터를 복제해야 합니다.따라서 다음과 같은 방법을 사용하는 것이 좋습니다.

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

그것이 진정한 방법이라고 생각합니다.

코틀린에서 사용하는 것은 다음과 같습니다.

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

이미 답이 나왔다는 것은 알지만, 하나의 항목을 선택하는 간단한 코드, 매우 간단합니다.

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

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

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

이는 이 페이지의 다른 부분에 있는 주석에 명시되어 있지만, 답변으로 끌어내는 것이 유용하다고 생각됩니다.

어댑터를 사용할 때, 저는 다음과 같은 것을 발견했습니다.spinnerObject.setSelection(INDEX_OF_CATEGORY2)다음 이후에 발생해야 합니다.setAdapter호출합니다. 그렇지 않으면 첫 번째 항목은 항상 초기 선택 항목입니다.

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

이는 다음에 대한 AbsSpinner 코드를 검토하여 확인할 수 있습니다.setAdapter.

연락처 목록이 있는 경우 다음 작업을 수행할 수 있습니다.

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }

대부분의 시간.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);
  }
});

제가 사용하고 있는 코틀린 확장자는 다음과 같습니다.

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)

효과적인 솔루션:

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

        spinnerAdapter.notifyDataSetChanged();
    }
});

예, 스피너의 setSelection 함수에서 원하는 스피너 항목의 인덱스를 전달하여 이를 달성할 수 있습니다.예:

스피너Object입니다.setSelection(INDEX_)OF_카테고리).

제 경우, 이 코드가 제 하루를 구했습니다.

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

의 확장 기능을 만들었습니다.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
}

이것은 저에게 효과가 있었습니다.

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

@sberezin의 솔루션과 비슷하지만 Start()에서 setSelection()을 호출합니다.

저는 어제부터 같은 문제가 있었습니다.안타깝게도 배열 목록의 첫 번째 항목은 기본적으로 스피너 위젯에 표시됩니다.또한 배열 목록에서 각 요소가 포함된 이전에 선택한 항목을 찾아 첫 번째 요소와 위치를 전환합니다.여기 코드가 있습니다.

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

언급URL : https://stackoverflow.com/questions/11072576/set-selected-item-of-spinner-programmatically