Spinner의 선택된 항목을 위치가 아닌 값으로 설정하는 방법은 무엇입니까?


296

Spinner의 데이터베이스에 저장된 값을 미리 선택 해야하는 업데이트보기가 있습니다.

나는 이런 식으로 생각하고 있었지만 방법 Adapter이 없기 indexOf때문에 붙어 있습니다.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}

답변:


644

Spinner이름이 mSpinner이고 선택 사항 중 하나로 "일부 값"이 포함되어 있다고 가정하십시오 .

Spinner에서 "일부 값"의 위치를 ​​찾아 비교하려면 다음을 사용하십시오.

String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
    int spinnerPosition = adapter.getPosition(compareValue);
    mSpinner.setSelection(spinnerPosition);
}

5
사용자 정의 어댑터를 사용하면 getPosition ()에 대한 코드를 작성 (재정의)해야합니다.
Soham

3
문자열이 아닌 객체 내부의 요소를 검사하지 않고 toString ()을 사용할 수없는 경우 스피너의 값이 toString ()의 출력과 다릅니다.
Ajibola

1
나는 이것이 아주 오래 알고 있지만, 지금하는 getPosition (T)에 검사되지 않은 호출 발생
브래드베이스

비슷한 오류가 발생했지만이 오래된 학교 방식을 사용하면 도움이되었습니다. stackoverflow.com/questions/25632549/…
Manny265

흠 ... 이제 Parse.com에서 값을 가져오고 기본 스피너 선택이 사용자의 데이터베이스 값으로 기본 설정되도록 사용자를 쿼리하려면 어떻게해야합니까?
drearypanoramic

141

값을 기준으로 스피너를 설정하는 간단한 방법은

mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString){
     for (int i=0;i<spinner.getCount();i++){
         if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
             return i;
         }
     }

     return 0;
 } 

복잡한 코드로가는 길은 이미 존재합니다.


7
break;프로세스 속도를 높이기 위해 색인이 발견되면 추가하는 것을 잊었습니다 .
spacebiker

break를 피하기 위해 do {} while ()을 사용하지 않는 이유는 무엇입니까?
Catluc

@Catluc 솔루션에 도달하는 방법은 여러 가지가 있습니다. 당신에게 가장 적합한 것이 무엇인지 선택하십시오
Akhil Jain

4
보다는 0, 당신은 반환해야 -1값이 발견되지 않는 경우 - 내 대답와 같이 stackoverflow.com/a/32377917/1617737을 :-)
금지 - 지구 공학

2
@ ban-geoengineering 0백업 시나리오로 작성 했습니다. 을 설정하면 -1스피너에서 볼 수있는 항목이 있습니다. 스피너 어댑터의 0 번째 요소를 가정하고 -1을 추가하면 값이 -1인지 여부를 과체중으로 추가하므로 설정 -1로 인해 예외가 발생합니다.
Akhil Jain

34

Spinners의 모든 항목에 대해 별도의 ArrayList를 유지합니다. 이렇게하면 ArrayList에서 indexOf를 수행 한 다음 해당 값을 사용하여 Spinner에서 선택을 설정할 수 있습니다.


다른 방법은 없습니다. 아시나요?
Pentium10

1
선택을 무로 설정하는 방법은 무엇입니까? (항목이 목록에없는 경우)
Pentium10

5
HashMap.get은 ArrayList.indexOf보다 나은 검색 속도를 제공합니다
Dandre Allison

29

Merrill의 답변을 바탕 으로이 단일 라인 솔루션을 생각해 냈습니다 ... 매우 예쁘지는 않지만이 Spinner기능을 포함하지 않는 코드를 유지 관리하는 사람을 비난 할 수 있습니다 .

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));

에 대한 캐스트 ArrayAdapter<String>가 확인되지 않은 방법에 대한 경고가 표시됩니다 . 실제로 ArrayAdapterMerrill처럼 a를 사용할 수 는 있지만 하나의 경고를 다른 경고로 교환합니다.


확인되지 않은 경고를 없애려면 <?를 사용해야합니다. 캐스트에서 <문자열> 대신. 실제로 타입으로 무엇이든 캐스팅 할 때는 언제나 <? >.
xbakesx

아니요, <? > 경고 대신 오류가 발생합니다. "ArrayAdapter <?> 유형의 getPosition (?) 메소드는 인수 (문자열)에 적용 할 수 없습니다."
ArtOfWarfare

그러면 유형이없는 ArrayAdapter라고 생각하므로 ArrayAdapter <String>이라고 가정하지 않습니다. 따라서 경고를 피하려면 ArrayAdapter <? 그런 다음 adapter.get ()의 결과를 문자열로 캐스트하십시오.
xbakesx

@Dadani-나는 어리석게 뒤얽혀 있기 때문에 이전에 Python을 사용한 적이 없다고 생각합니다.
ArtOfWarfare

동의, 나는 Python @ArtOfWarfare를 가지고 놀지 않았지만 이것은 특정 작업을위한 빠른 방법입니다.
Daniel Dut

13

문자열 배열을 사용하는 경우 이것이 가장 좋은 방법입니다.

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);

10

이것을 사용할 수도 있습니다.

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));

훌륭한 일!
Sadman Hasan

8

이전 어댑터에 indexOf 메소드가 필요하고 기본 구현을 모르는 경우 다음을 사용할 수 있습니다.

private int indexOf(final Adapter adapter, Object value)
{
    for (int index = 0, count = adapter.getCount(); index < count; ++index)
    {
        if (adapter.getItem(index).equals(value))
        {
            return index;
        }
    }
    return -1;
}

7

Merrill의 답변을 바탕으로 CursorAdapter를 사용하는 방법이 있습니다.

CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
    for(int i = 0; i < myAdapter.getCount(); i++)
    {
        if (myAdapter.getItemId(i) == ordine.getListino() )
        {
            this.spinner_listino.setSelection(i);
            break;
        }
    }

6

다음 줄을 사용하여 값 사용을 선택하십시오.

mSpinner.setSelection(yourList.indexOf("value"));

3

이 코드로 충분하기 때문에 사용자 정의 어댑터를 사용하고 있습니다.

yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text"));

따라서 코드 스 니펫은 다음과 같습니다.

void setSpinner(String value)
    {
         yourSpinner.setSelection(arrayAdapter.getPosition(value));
    }

3

이것은 문자열로 색인을 얻는 간단한 방법입니다.

private int getIndexByString(Spinner spinner, String string) {
    int index = 0;

    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(string)) {
            index = i;
            break;
        }
    }
    return index;
}

3

이 방법을 사용하면 코드를 더 간단하고 명확하게 만들 수 있습니다.

ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCountry.getAdapter();
int position = adapter.getPosition(obj.getCountry());
spinnerCountry.setSelection(position);

도움이 되길 바랍니다.


2

여기 내 해결책이 있습니다

List<Country> list = CountryBO.GetCountries(0);
CountriesAdapter dataAdapter = new CountriesAdapter(this,list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnCountries.setAdapter(dataAdapter);
spnCountries.setSelection(dataAdapter.getItemIndexById(userProfile.GetCountryId()));

아래의 getItemIndexById

public int getItemIndexById(String id) {
    for (Country item : this.items) {
        if(item.GetId().toString().equals(id.toString())){
            return this.items.indexOf(item);
        }
    }
    return 0;
}

이 도움을 바랍니다!


2

다음을 사용하는 경우 수행 방법은 다음과 같습니다 SimpleCursorAdapter(여기서는 columnName을 채우는 데 사용 된 db 열의 이름 spinner).

private int getIndex(Spinner spinner, String columnName, String searchString) {

    //Log.d(LOG_TAG, "getIndex(" + searchString + ")");

    if (searchString == null || spinner.getCount() == 0) {

        return -1; // Not found
    }
    else {

        Cursor cursor = (Cursor)spinner.getItemAtPosition(0);

        int initialCursorPos = cursor.getPosition(); //  Remember for later

        int index = -1; // Not found
        for (int i = 0; i < spinner.getCount(); i++) {

            cursor.moveToPosition(i);
            String itemText = cursor.getString(cursor.getColumnIndex(columnName));

            if (itemText.equals(searchString)) {
                index = i; // Found!
                break;
            }
        }

        cursor.moveToPosition(initialCursorPos); // Leave cursor as we found it.

        return index;
    }
}

또한 ( Akhil 's answer 의 개선 ) 이것은 배열에서 Spinner를 채우는 경우 해당하는 방법입니다.

private int getIndex(Spinner spinner, String searchString) {

    if (searchString == null || spinner.getCount() == 0) {

        return -1; // Not found

    }
    else {

        for (int i = 0; i < spinner.getCount(); i++) {
            if (spinner.getItemAtPosition(i).toString().equals(searchString)) {
                return i; // Found!
            }
        }

        return -1; // Not found
    }
};

1

XML 레이아웃에서 XML 배열을 스피너로 설정하면 다음을 수행 할 수 있습니다.

final Spinner hr = v.findViewById(R.id.chr);
final String[] hrs = getResources().getStringArray(R.array.hours);
if(myvalue!=null){
   for (int x = 0;x< hrs.length;x++){
      if(myvalue.equals(hrs[x])){
         hr.setSelection(x);
      }
   }
}

0

실제로 AdapterArray에서 인덱스 검색을 사용하여이를 얻을 수있는 방법이 있으며이 모든 것을 반영하여 수행 할 수 있습니다. 10 개의 Spinner가 있고 데이터베이스에서 동적으로 설정하고 싶었으므로 한 단계 더 나아가서 Spinner가 실제로 주마다 변경되므로 데이터베이스는 텍스트가 아닌 값만 보유하므로 값은 데이터베이스의 내 id 번호입니다.

 // Get the JSON object from db that was saved, 10 spinner values already selected by user
 JSONObject json = new JSONObject(string);
 JSONArray jsonArray = json.getJSONArray("answer");

 // get the current class that Spinner is called in 
 Class<? extends MyActivity> cls = this.getClass();

 // loop through all 10 spinners and set the values with reflection             
 for (int j=1; j< 11; j++) {
      JSONObject obj = jsonArray.getJSONObject(j-1);
      String movieid = obj.getString("id");

      // spinners variable names are s1,s2,s3...
      Field field = cls.getDeclaredField("s"+ j);

      // find the actual position of value in the list     
      int datapos = indexedExactSearch(Arrays.asList(Arrays.asList(this.data).toArray()), "value", movieid) ;
      // find the position in the array adapter
      int pos = this.adapter.getPosition(this.data[datapos]);

      // the position in the array adapter
      ((Spinner)field.get(this)).setSelection(pos);

}

필드가 오브젝트의 최상위 레벨에있는 한 거의 모든 목록에서 사용할 수있는 색인화 된 검색이 있습니다.

    /**
 * Searches for exact match of the specified class field (key) value within the specified list.
 * This uses a sequential search through each object in the list until a match is found or end
 * of the list reached.  It may be necessary to convert a list of specific objects into generics,
 * ie: LinkedList&ltDevice&gt needs to be passed as a List&ltObject&gt or Object[&nbsp] by using 
 * Arrays.asList(device.toArray(&nbsp)).
 * 
 * @param list - list of objects to search through
 * @param key - the class field containing the value
 * @param value - the value to search for
 * @return index of the list object with an exact match (-1 if not found)
 */
public static <T> int indexedExactSearch(List<Object> list, String key, String value) {
    int low = 0;
    int high = list.size()-1;
    int index = low;
    String val = "";

    while (index <= high) {
        try {
            //Field[] c = list.get(index).getClass().getDeclaredFields();
            val = cast(list.get(index).getClass().getDeclaredField(key).get(list.get(index)) , "NONE");
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        if (val.equalsIgnoreCase(value))
            return index; // key found

        index = index + 1;
    }

    return -(low + 1);  // key not found return -1
}

여기서 모든 프리미티브에 대해 생성 할 수있는 캐스트 방법은 string 및 int에 대한 것입니다.

        /**
 *  Base String cast, return the value or default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type String
 */
public static String cast(Object object, String defaultValue) {
    return (object!=null) ? object.toString() : defaultValue;
}


    /**
 *  Base integer cast, return the value or default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type integer
 */
public static int cast(Object object, int defaultValue) { 
    return castImpl(object, defaultValue).intValue();
}

    /**
 *  Base cast, return either the value or the default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type Object
 */
public static Object castImpl(Object object, Object defaultValue) {
    return object!=null ? object : defaultValue;
}

0

응용 프로그램이 마지막으로 선택한 스피너 값을 기억하게하려면 아래 코드를 사용할 수 있습니다.

  1. 아래 코드는 스피너 값을 읽고 스피너 위치를 적절하게 설정합니다.

    public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    int spinnerPosition;
    
    Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.ccy_array,
            android.R.layout.simple_spinner_dropdown_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_list_item_activated_1);
    // Apply the adapter to the spinner
    spinner1.setAdapter(adapter1);
    // changes to remember last spinner position
    spinnerPosition = 0;
    String strpos1 = prfs.getString("SPINNER1_VALUE", "");
    if (strpos1 != null || !strpos1.equals(null) || !strpos1.equals("")) {
        strpos1 = prfs.getString("SPINNER1_VALUE", "");
        spinnerPosition = adapter1.getPosition(strpos1);
        spinner1.setSelection(spinnerPosition);
        spinnerPosition = 0;
    }
  2. 그리고 최신 스피너 값이 있거나 필요한 다른 곳에 코드를 아래에 넣으십시오. 이 코드는 기본적으로 Spinner 값을 SharedPreferences로 작성합니다.

        Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
        String spinlong1 = spinner1.getSelectedItem().toString();
        SharedPreferences prfs = getSharedPreferences("WHATEVER",
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prfs.edit();
        editor.putString("SPINNER1_VALUE", spinlong1);
        editor.commit();

0

cursorLoader를 사용하여 채워진 스피너에서 올바른 항목을 선택하려고 할 때도 동일한 문제가 발생했습니다. 먼저 표 1에서 선택하려는 항목의 ID를 검색 한 다음 CursorLoader를 사용하여 스피너를 채 웁니다. onLoadFinished에서 나는 이미 가지고있는 ID와 일치하는 항목을 찾을 때까지 스피너의 어댑터를 채우는 커서를 순환했습니다. 그런 다음 커서의 행 번호를 스피너의 선택된 위치에 할당합니다. 저장된 스피너 결과를 포함하는 폼에 세부 정보를 채울 때 스피너에서 선택하려는 값의 id를 전달하는 비슷한 함수를 갖는 것이 좋습니다.

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
  adapter.swapCursor(cursor);

  cursor.moveToFirst();

 int row_count = 0;

 int spinner_row = 0;

  while (spinner_row < 0 || row_count < cursor.getCount()){ // loop until end of cursor or the 
                                                             // ID is found 

    int cursorItemID = bCursor.getInt(cursor.getColumnIndexOrThrow(someTable.COLUMN_ID));

    if (knownID==cursorItemID){
    spinner_row  = row_count;  //set the spinner row value to the same value as the cursor row 

    }
cursor.moveToNext();

row_count++;

  }

}

spinner.setSelection(spinner_row ); //set the selected item in the spinner

}

0

이전 답변 중 일부가 옳았 으므로이 문제에 빠지지 않도록하십시오.

당신이에 값을 설정하면 ArrayList사용 String.format, 당신은 동일한 문자열 구조를 사용하여 값의 위치를 받아야합니다 String.format.

예를 들면 :

ArrayList<String> myList = new ArrayList<>();
myList.add(String.format(Locale.getDefault() ,"%d", 30));
myList.add(String.format(Locale.getDefault(), "%d", 50));
myList.add(String.format(Locale.getDefault(), "%d", 70));
myList.add(String.format(Locale.getDefault(), "%d", 100));

필요한 값의 위치를 ​​다음과 같이 가져와야합니다.

myList.setSelection(myAdapter.getPosition(String.format(Locale.getDefault(), "%d", 70)));

그렇지 않으면을 (를) -1찾을 수 없습니다!

나는 아랍어Locale.getDefault() 때문에 사용했습니다 .

도움이 되길 바랍니다.


0

희망적으로 완전한 해결책이 있습니다. 나는 다음과 같은 열거 형을 가지고있다 :

public enum HTTPMethod {GET, HEAD}

다음 클래스에서 사용

public class WebAddressRecord {
...
public HTTPMethod AccessMethod = HTTPMethod.HEAD;
...

HTTPMethod 열거 형 멤버로 스피너를 설정하는 코드 :

    Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod);
    ArrayAdapter<HTTPMethod> adapter = new ArrayAdapter<HTTPMethod>(this, android.R.layout.simple_spinner_item, HTTPMethod.values());
    mySpinner.setAdapter(adapter);
    int selectionPosition= adapter.getPosition(webAddressRecord.AccessMethod);
    mySpinner.setSelection(selectionPosition);

어디는 R.id.spinnerHttpmethod레이아웃 파일에 정의되며, android.R.layout.simple_spinner_item안드로이드 스튜디오에 의해 제공됩니다.


0
YourAdapter yourAdapter =
            new YourAdapter (getActivity(),
                    R.layout.list_view_item,arrData);

    yourAdapter .setDropDownViewResource(R.layout.list_view_item);
    mySpinner.setAdapter(yourAdapter );


    String strCompare = "Indonesia";

    for (int i = 0; i < arrData.length ; i++){
        if(arrData[i].getCode().equalsIgnoreCase(strCompare)){
                int spinnerPosition = yourAdapter.getPosition(arrData[i]);
                mySpinner.setSelection(spinnerPosition);
        }
    }

StackOverflow에 오신 것을 환영합니다. 코드 만있는 답변은 "품질이 낮으므로"삭제 된 것으로 표시되는 경향이 있습니다. 질문에 대한 답변 섹션을 읽고 답변에 해설을 추가하십시오.
Graham

@ user2063903, 답변에 설명을 추가하십시오.
LuFFy

0

매우 간단한 사용 getSelectedItem();

예 :

ArrayAdapter<CharSequence> type=ArrayAdapter.createFromResource(this,R.array.admin_typee,android.R.layout.simple_spinner_dropdown_item);
        type.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mainType.setAdapter(type);

String group=mainType.getSelectedItem().toString();

위의 방법은 문자열 값을 반환

위의 R.array.admin_type값에 문자열 리소스 파일이 있습니다.

값 >> 문자열에 .xml 파일을 만드십시오.


0

리소스의 문자열 배열에서 스피너를 채우고 서버에서 선택한 값을 유지하려고한다고 가정합니다. 따라서 이것은 스피너의 서버에서 선택한 값을 설정하는 한 가지 방법입니다.

pincodeSpinner.setSelection(resources.getStringArray(R.array.pincodes).indexOf(javaObject.pincode))

그것이 도움이되기를 바랍니다! 추신 : 코드는 코 틀린에 있습니다!


0

Localization 과 함께 작동하는 무언가가 필요했기 때문에 다음 두 가지 방법을 생각해 냈습니다.

    private int getArrayPositionForValue(final int arrayResId, final String value) {
        final Resources english = Utils.getLocalizedResources(this, new Locale("en"));
        final List<String> arrayValues = Arrays.asList(english.getStringArray(arrayResId));

        for (int position = 0; position < arrayValues.size(); position++) {
            if (arrayValues.get(position).equalsIgnoreCase(value)) {
                return position;
            }
        }
        Log.w(TAG, "getArrayPosition() --> return 0 (fallback); No index found for value = " + value);
        return 0;
    }

보시다시피, arrays.xml과 비교 하는 대소 문자 구분이 복잡해졌습니다 value. 이것이 없으면 위의 방법을 다음과 같이 단순화 할 수 있습니다.

return arrayValues.indexOf(value);

정적 도우미 방법

public static Resources getLocalizedResources(Context context, Locale desiredLocale) {
        Configuration conf = context.getResources().getConfiguration();
        conf = new Configuration(conf);
        conf.setLocale(desiredLocale);
        Context localizedContext = context.createConfigurationContext(conf);
        return localizedContext.getResources();
    }

-3

REPEAT [position]과 같은 위치로 사용자 정의 어댑터를 전달해야합니다. 제대로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.