Seçilen iplikçi öğesini programlı olarak ayarla


384

Ben bir android proje üzerinde çalışıyorum ve veritabanından doldurulmuş bir dizi adaptörü kullanan bir spinner kullanıyorum.

Seçilen öğeyi listeden programlı olarak nasıl ayarlayabileceğimi bulamıyorum. Örneğin, değer değiştiricide şu öğelere sahibim:

  • Kategori 1
  • Kategori 2
  • Kategori 3

Ekran oluşturulduğunda Kategori 2'yi programlı olarak seçilen öğeyi nasıl yaparım? Ben c # IE Spinner.SelectedText = "Kategori 2" benzer olabilir düşünüyordum ama Android için buna benzer herhangi bir yöntem gibi görünmüyor.


Lütfen şu bağlantıyı izleyin: [Dönücü öğesinde seçim nasıl ayarlanır] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy

1
Dizininizi içine aktarabilirsiniz spinner.setSelection(). Bu iyi olur. Ayrıca, dizinlerinizi gerçek dizelerle eşleştirmenize yardımcı olabilecek bir yöntem de oluşturabilirsiniz.
Taslim Oseni

Yanıtlar:


737

Aşağıdakileri kullanın: spinnerObject.setSelection(INDEX_OF_CATEGORY2).


286
Teşekkürler, bu harika çalıştı, bunu yaparken ben de adaptör üzerinden döngü gerekmeden dizin elde etmenin bir yolunu buldum. Aşağıdakileri kullandımmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

86
başvurmak için adaptör yoksa. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()) getPosition ( "değer").);
Kalel Wade

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

setAdapter () öğesinden hemen sonra SetSelection () öğesini çağırmak, her zaman 1. öğeyi (Android 2.3) görüntülüyor gibi görünüyor, hatta dropView'da iyi olanı bile seçiliyor. view.post () (@Marco Hernaiz Cao yanıtı) ekleyerek onu düzelt.
Mesih

3
Spinner'da bir onItemSelectedListener () varsa bu çalışmaz. Dinleyici çağrılmaz.
Don Larynx

80

Bu cevaplardan hiç kimse bana çözüm vermedi, sadece bununla çalıştı:

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

3
SetAdapter () 'den hemen sonra SetSelection ()' ı çağırıyorum. Bu, her zaman 1. öğeyi görüntüler (Android 2.3), dropView'da iyi olanı bile seçilir. Çözümün benim için yaptı.
Mesih

2
Teşekkürler, işe yaradı! Btw yanı ListView.post.run () performItemClick () için çalışır
Michael D.

Sonuncuyu boyuta göre nasıl seçebilirim?
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;
        }
    }
}

Yukarıdaki gibi kullanabilirsiniz:

selectSpinnerItemByValue(spinnerObject, desiredValue);

& tabii ki doğrudan endekse göre de seçebilirsiniz

spinnerObject.setSelection(index);

Bu kodla ilgili bir hata @Boardy ( Category 2Diyelim ki kullanmayı denediği varsayılarak) bir dize olduğunu varsayalım seçimini istiyorum Spinner.SelectedText = "Category 2"ama yukarıdaki kod bir içindir long.
Arun George

Veritabanından kategorileri dolduruyor, her kategori için bir kimlik olmalıdır.
Yaqub Ahmad

1
Neden bir CursorAdapter olduğunu varsayalım? SpinnerAdapter da aynı şekilde çalışır.
Greg Ennis

Bence burada bir hata var, öyle olmalı adapter.getItem(position), değil adapter.getItemId(position).
Vadim Kotov

29

Bazı açıklamalar (en azından Fragmanlar için - asla saf aktivite ile denenmemiş). Umarım birisinin Android'i daha iyi anlamasına yardımcı olur.

Arun George'un en popüler cevabı doğrudur, ancak bazı durumlarda işe yaramaz. Marco HC'nin
cevabı , ilave CPU yükü nedeniyle son çare olan Runnable kullanıyor.

Cevap - setSelection () öğesini çağırmak için doğru yeri seçmeniz gerekir , örneğin benim için çalışır :

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

    yourSpinner.setSelection(pos);
 }

Ancak onCreateView () öğesinde çalışmaz . Bu konuyla ilgilenmenin nedeni bu olduğundan şüpheleniyorum.

İşin sırrı, Android ile herhangi bir yöntemde istediğiniz herhangi bir şeyi yapamayacağınızdır - oops :( - bileşenler hazır olmayabilir. Başka bir örnek olarak - ScrollView'ı ne onCreateView () ne de onResume () ( cevabı buradan görebilirsiniz )


Teşekkürler - Fragments'ın onResume yöntemine sahip olduğunu bilmiyordum.
ToolmakerSteve

Cevabınızı @Marco HC'nin üzerinde olacak şekilde +18 verebilirim. Yapılması gereken şeyleri yapmaya çalışan tek kişi
sizsiniz

15

Bir değer bulmak ve seçmek için:

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

Neden değerlerinizi DB'den kullanmıyorsunuz ve bunları bir ArrayList'te saklamıyorsunuz ve daha sonra şunu kullanıyorsunuz:

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

1
DataAdapter kullanan çeşitli çözümler benim için işe yaramadı, ancak değerlerin bu örnekte oluşturulduğu ArrayList'i kullanmak hile yaptı.
ewall

8

En uygun çözüm:

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

Öğenin konumunu otomatik olarak almak için aşağıdaki ifadeyi ekleyin

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));

7

Benim UtilityClass benim yaptığım gibi bu tür işler için genel bir yöntem yapabilirsiniz

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

Kolayca şu şekilde ayarlayabilirsiniz: spinner.setSelection(1)1 yerine, göstermek istediğiniz listenin herhangi bir konumunu ayarlayabilirsiniz.


4

Bu yazıdaki respose kullanmak için veri çoğaltmak zorunda SimpleCursorAdapter var. Bu şekilde denemenizi tavsiye ederim:

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

Bence bu gerçek bir yol


1
evet, SimpleCursorAdapter durumunda, spinnerRegion.getItemIdAtPosition (i) sütunları almak için kullanılabilen bir İmleç verir.
lalitm

3

Bu benim için bir iş.

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

+1 ne olacak?
SHADOW.NET

Çünkü 0'dan başlıyor, bu yüzden doğru cevabı almak için bir tane eklemeliyiz
Arpit Patel

2

Kişi listeniz varsa, bunun için gidebilirsiniz:

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

2

Ben zaten cevap, ama bir öğe seçmek için basit kod biliyorum, çok basit:

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
Cevabınızı açıklamak için biraz metin ekleyebilir misiniz?
Kmeixner

2

Bu, bu sayfanın başka bir yerinde yorumlarda belirtilmiştir, ancak bir cevaba çekmenin faydalı olduğunu düşünmektedir:

Bir adaptör kullanırken , çağrıdan sonraspinnerObject.setSelection(INDEX_OF_CATEGORY2) ihtiyaçların olduğunu buldum ; aksi takdirde, ilk öğe her zaman ilk seçimdir.setAdapter

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

Bu AbsSpinner inceleyerek teyit edilir kodu için setAdapter.


Tabii ki, bir öğeyi yalnızca adaptör dolduktan sonra seçebilirsiniz.
CoolMind

2

Kotlin'de kullandığım şey bu:

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

eğer indexOfbir eşleşme yapılamazsa, o zaman döndürülür -1ve varsayılan değerin seçili olmasına neden olur spinner.setSelection. Bununla iyiyim.
lasec0203

0

Benim durumumda, bu kod günümü kurtardı:

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

Bunu yapmanıza gerek yok. Bağdaştırıcı int konumunu döndüren bir getPosition (item) çağrısına sahiptir.
tzg

0

Çoğu zaman spinner.setSelection(i); //i is 0 to (size-1) of adapter's size çalışmaz. Sadece ararsanspinner.setSelection(i);

Bu sizin mantığınıza bağlıdır.

Görünüm tamamen yüklüyse ve arayüzden çağırmak istiyorsanız aramanızı öneririm

spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size

Veya etkinlik / parça yaşam döngüsü arasında geçiş yapmak istiyorsanız, şu şekilde çağırın

spinner.post(new Runnable() {
  @Override public void run() {
    spinner.setSelection(i);
  }
});

0

SpinnerVeri yüklemek ve öğe seçimini izlemek için bazı uzantı işlevi yapmıştım .

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

Kullanım Örneği

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

Bu benim için çalıştı:

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

@ Sberezin çözümüne benzer ancak onStart () içindeki setSelection () öğesini çağırır.


-1

Maalesef dizi listesindeki ilk öğe varsayılan olarak spinner widget'ında gösteriliyor. İşte kod.

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