Seçilen Spinner öğesini konuma göre değil, değere göre nasıl ayarlayabilirim?


298

Bir Spinner için veritabanında depolanan değeri önceden seçmem gereken bir güncelleştirme görünümü var.

Aklında böyle bir şey vardı, ama Adapterhiçbir indexOfyöntemi yoktur , bu yüzden sıkışmış.

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

Yanıtlar:


647

Senin varsayalım SpinneradlandırılırmSpinner ve onun seçeneklerden biri olarak içerir: "Bazı değeri".

Spinner'daki "bazı değerlerin" konumunu bulmak ve karşılaştırmak için bunu kullanın:

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
özel bir adaptörle getPosition () için kodu yazmanız (geçersiz kılmanız) gerekecektir
Soham

3
Bir dizeye değil, bir nesnenin içindeki bir öğeye karşı kontrol ediyorsanız ve sadece toString () yöntemini kullanmak mümkün değilse, değer değiştiricinin değeri toString () 'nin çıktısından farklılık gösterir.
Ajibola

1
Bunun çok eski olduğunu biliyorum, ama şimdi getPosition (T) için kontrolsüz bir çağrı atıyor
Brad Bass

benzer hatalar atılmış, ancak bu eski okul yolunu kullanarak yardımcı oldu: stackoverflow.com/questions/25632549/…
Manny265

Hmm ... Şimdi, değeri Parse.com'dan alıp varsayılan değer değiştirici seçimi varsayılan olarak kullanıcının veritabanı değerine ayarlanacak şekilde kullanıcıyı sorgulamak istersem ne olur?
drearypanoramic

142

Değer değiştiriciyi değere göre ayarlamanın basit bir yolu

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

Karmaşık kodlara giden yol zaten orada, bu sadece daha düz.


7
break;İşlemi hızlandırmak için dizin bulunduğunda eklemeyi unuttunuz .
spacebiker

neden break kullanmamak için do {} while () kullanmıyorsunuz?
Catluc

@Catluc çözüme ulaşmanın n yolu var, siz seçin ... sizin için en iyi olanı seçin
Akhil Jain

4
Bunun yerine , değer bulunamazsa 0geri -1
dönmelisiniz

2
@ ban-geoengineering 0Yedek senaryo olarak yazdım . Ayarlarsanız -1, hangi öğeyi döndürücüde görünür olurum, döndürücü adaptörünün 0'ıncı öğesini varsayalım, -1 eklenmesi de değerin -1 olup olmadığını kontrol etmenin fazla kilolu olduğunu ekler, -1 ayarı istisnaya neden olur.
Akhil Jain

34

Spinners'ımdaki tüm öğelerden ayrı bir ArrayList tutuyorum. Bu şekilde ArrayList üzerinde indexOf yapabilir ve daha sonra Spinner'da seçimi ayarlamak için bu değeri kullanabilirim.


Başka yolu yok, biliyor musun?
Pentium10

1
Seçim hiçbir şeye nasıl ayarlanmaz? (öğe listede yoksa)
Pentium10 6:10

5
HashMap.get ArrayList.indexOf daha iyi arama hızı verecek
Dandre Allison

29

Merrill'in cevabına dayanarak, bu tek hat çözümünü buldum ... çok hoş değil, ama bunu yapan Spinnerbir işlevi dahil etmeyi ihmal ettiği için kodu kimin koruduğunu suçlayabilirsiniz .

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

A'ya yapılan almanın nasıl ArrayAdapter<String>denetlenmediğiyle ilgili bir uyarı alırsınız ... gerçekten, ArrayAdapterMerrill'in yaptığı gibi sadece kullanabilirsiniz , ancak bu sadece bir uyarıyı diğeriyle değiştirir.


İşaretlenmemiş uyarıdan kurtulmak için <? > dökümünüzde <Dtring> yerine. Aslında, herhangi bir türde bir şey yayınladığınızda, <? >.
xbakesx

Hayır, <? > bana uyarı yerine bir hata veriyor: "ArrayAdapter <?> türündeki getPosition (?) yöntemi bağımsız değişken (String) için geçerli değil."
ArtOfWarfare

Doğru, daha sonra onun türü olmayan bir ArrayAdapter olduğunu düşünür, bu yüzden bir ArrayAdapter <String> olduğunu varsaymaz. Bu yüzden uyarıyı önlemek için ArrayAdapter <? > sonra adaptor.get () sonucunuzu bir String'e yayınlayın.
xbakesx

@Dadani - Daha önce hiç Python kullanmadığınızı düşünüyorum, çünkü bu aptalca kıvrık.
ArtOfWarfare

Kabul ettim, Python @ArtOfWarfare ile oynamadım, ancak bu belirli görevler için hızlı bir yol.
Daniel Dut

13

string dizisi kullanıyorsanız bu en iyi yoldur:

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

10

Bunu da kullanabilirsiniz,

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

Mükemmel Çalışma!
Sadman Hasan

8

Herhangi bir eski Bağdaştırıcıda bir indexOf yöntemine ihtiyacınız varsa (ve temeldeki uygulamayı bilmiyorsanız), bunu kullanabilirsiniz:

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'in cevabına dayanarak burada bir CursorAdapter ile nasıl yapacağınız var

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

Değer kullanarak seçmek için aşağıdaki satırı kullanın:

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

3

Bu kod yeterli için özel bir bağdaştırıcı kullanıyorum:

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

Kod snippet'iniz şöyle olacak:

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

3

Dizini dizeye göre almak için benim basit yöntem budur.

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

Bu şekilde kullanabilirsiniz, sadece kodunuzu daha basit ve daha net hale getirin.

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

Umarım yardımcı olur.


2

işte benim çözümüm

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

ve aşağıda 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;
}

Umarım bu yardım!


2

Bir SimpleCursorAdapter( eğer columnNamedoldurmak için kullandığınız db sütununun adı nerede) kullanıyorsanız bunu nasıl yapacağınız aşağıda açıklanmıştır 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;
    }
}

Ayrıca ( Akhil'in cevabının iyileştirilmesi), Spinner'ınızı bir diziden dolduruyorsanız, bunu yapmanın karşılık gelen yoludur:

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 düzeninde döndürücüye bir XML dizisi ayarlarsanız, bunu yapabilirsiniz

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

Aslında bunu AdapterArray üzerinde bir dizin araması kullanarak almanın bir yolu var ve tüm bunlar yansıma ile yapılabilir. 10 Spinner'ım vardı ve bunları veritabanımdan dinamik olarak ayarlamak istedim ve veritabanı, değer, veritabanından kimlik numaram olduğu için Spinner aslında haftadan haftaya değiştiği için sadece metni değil değeri tutar.

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

}

Alanlar nesnenin en üst düzeyinde olduğu sürece hemen hemen her listede kullanabileceğiniz dizine alınmış arama.

    /**
 * 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
}

Burada tüm ilkel öğeler için oluşturulabilecek döküm yöntemi string ve int için bir yöntemdir.

        /**
 *  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

Uygulamanın son seçilen değer değiştiricileri hatırlamasını sağlamak için aşağıdaki kodu kullanabilirsiniz:

  1. Aşağıdaki kod, değer değiştirici değerini okur ve değer değiştirici konumunu buna göre ayarlar.

    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. Ve en son eğirme değerlerinin mevcut olduğunu bildiğiniz yere veya gerektiğinde başka bir yere kod koyun. Bu kod parçası temel olarak spinner değerini SharedPreferences'a yazar.

        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

Bir cursorLoader kullanarak doldurulmuş bir spinner doğru öğeyi seçmek için çalışırken aynı sorunu vardı. Önce tablo 1'den seçmek istediğim öğenin kimliğini aldım ve sonra döndürücüyü doldurmak için bir CursorLoader kullandım. OnLoadFinished'da, zaten sahip olduğum id ile eşleşen öğeyi bulana kadar spinner'ın adaptörünü dolduran imleçten geçtim. Ardından, imlecin satır numarasını döndürücünün seçtiği konuma atayın. Kaydedilmiş döndürücü sonuçlarını içeren bir formdaki ayrıntıları doldururken, döndürücüde seçmek istediğiniz değerin kimliğini iletmek için benzer bir işleve sahip olmak güzel olurdu.

@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

Önceki cevaplardan bazıları çok doğru olduğu için, hiçbirinizin böyle bir soruna düşmemesini sağlamak istiyorum.

Değerleri ArrayListusing olarak ayarlarsanız, değerin String.formatkonumunu aynı dize yapısını kullanarak almanız GEREKİR String.format.

Bir örnek:

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

Aşağıdaki gibi gerekli değerin pozisyonunu almalısınız:

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

Aksi takdirde, -1öğe bulunamadı!

ArapçaLocale.getDefault() nedeniyle kullandım .

Umarım bu sizin için yararlı olacaktır.


0

İşte umarım eksiksiz çözümüm. Aşağıdaki numaralandırma var:

public enum HTTPMethod {GET, HEAD}

aşağıdaki sınıfta kullanılır

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

Spinner'ı HTTPMethod enum üyesine göre ayarlama kodu:

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

Nerede R.id.spinnerHttpmethodbir düzen dosyasında tanımlanır ve android.R.layout.simple_spinner_itemandroid-studio tarafından teslim edilir.


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'a hoş geldiniz. İçlerinde yalnızca kod bulunan yanıtlar, "düşük kalite" oldukları için silinmek üzere işaretlenir. Lütfen soruları yanıtlamayla ilgili yardım bölümünü okuyun ve ardından Cevabınıza biraz yorum eklemeyi düşünün.
Graham

@ user2063903, Lütfen cevabınıza açıklama ekleyin.
LuFFy

0

çok basit sadece kullan getSelectedItem();

Örneğin :

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

yukarıdaki yöntem bir dize değeri döndürür

yukarıda R.array.admin_typedeğerlerde bir dize kaynak dosyasıdır

sadece değerlerde bir .xml dosyası oluşturun >> dizeleri


0

Döndürücüyü kaynaktan dize dizisinden doldurmanız gerektiğini ve değeri sunucudan seçmeye devam etmek istediğinizi varsayalım. Bu, değer değiştiricideki sunucudan bir değer seçmenin bir yoludur.

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

Umarım yardımcı olur! PS kodu Kotlin'de!


0

Yerelleştirme ile de çalışan bir şeye ihtiyacım olduğu için şu iki yöntemi buldum:

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

Gördüğünüz gibi, ben de arrays.xml ve ben karşılaştırıyorum durum hassasiyeti ek karmaşıklık üzerinde tökezledi value. Buna sahip değilseniz, yukarıdaki yöntem aşağıdaki gibi basitleştirilebilir:

return arrayValues.indexOf(value);

Statik yardımcı yöntemi

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

özel adaptörünüzü REPEAT [position] gibi bir konumdan geçirmeniz gerekir. ve düzgün çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.