Setel item pemintal yang dipilih secara terprogram

384

Saya sedang mengerjakan proyek android dan saya menggunakan spinner yang menggunakan adaptor array yang diisi dari basis data.

Saya tidak dapat mengetahui bagaimana saya dapat mengatur item yang dipilih secara program dari daftar. Misalnya, dalam spinner saya memiliki item berikut:

  • Kategori 1
  • Kategori 2
  • Kategori 3

Bagaimana saya secara terprogram membuat Kategori 2 item yang dipilih ketika layar dibuat. Saya berpikir mungkin mirip dengan c # IE Spinner.SelectedText = "Kategori 2" tetapi tampaknya tidak ada metode yang mirip dengan ini untuk Android.

Boardy
sumber
Silakan ikuti tautan ini: [Cara mengatur pilihan pada item pemintal] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy
1
Anda dapat memasukkan indeks Anda ke spinner.setSelection(). Itu akan bekerja dengan baik. Anda juga dapat membuat metode yang dapat membantu Anda mencocokkan indeks Anda dengan string mereka yang sebenarnya.
Taslim Oseni

Jawaban:

737

Gunakan berikut: spinnerObject.setSelection(INDEX_OF_CATEGORY2).

Arun George
sumber
287
Terima kasih, ini bekerja dengan baik, ketika saya melakukan ini, saya juga menemukan cara untuk mendapatkan indeks tanpa perlu mengulang melalui adaptor. Saya menggunakan yang berikut inimySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy
86
jika Anda tidak memiliki adaptor untuk referensi. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()). getPosition ("Value"));
Kalel Wade
3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Goofyahead
memanggil SetSelection () tepat setelah setAdapter () tampaknya selalu menampilkan item pertama (Android 2.3), bahkan item yang bagus dipilih di dropView. menambahkan view.post () (@Marco Hernaiz Cao jawab) perbaiki untuk saya.
Kristus
3
Ini tidak berfungsi jika Spinner memiliki onItemSelectedListener (). Pendengar tidak akan dipanggil.
Don Larynx
80

Tidak satu pun dari jawaban ini yang memberi saya solusi, hanya bekerja dengan ini:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
Marco HC
sumber
3
Saya memanggil SetSelection () tepat setelah setAdapter (). Ini menampilkan item pertama selalu (Android 2.3), bahkan yang bagus dipilih di dropView. Solusi Anda berhasil untuk saya.
Kristus
2
Terima kasih, itu berhasil! btw bekerja untuk ListView.post.run () performItemClick () juga
Michael D.
Bagaimana saya bisa memilih yang terakhir berdasarkan ukuran?
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;
        }
    }
}

Anda dapat menggunakan seperti di atas:

selectSpinnerItemByValue(spinnerObject, desiredValue);

& tentu saja Anda juga dapat memilih berdasarkan indeks secara langsung suka

spinnerObject.setSelection(index);
Yaqub Ahmad
sumber
Kesalahan dengan kode ini adalah bahwa @Boardy ingin pemilihan Category 2yang saya kira adalah sebuah String (dengan asumsi ia mencoba menggunakan Spinner.SelectedText = "Category 2") tetapi kode di atas adalah untuk a long.
Arun George
Dia mengisi kategori dari database harus ada ID untuk setiap kategori.
Yaqub Ahmad
1
Mengapa menganggap itu adalah CursorAdapter? SpinnerAdapter juga berfungsi.
Greg Ennis
Saya pikir Anda memiliki kesalahan di sini, seharusnya adapter.getItem(position), bukan adapter.getItemId(position).
Vadim Kotov
29

Beberapa penjelasan (setidaknya untuk Fragmen - tidak pernah mencoba dengan Aktivitas murni). Semoga ini membantu seseorang untuk memahami Android dengan lebih baik.

Jawaban paling populer oleh Arun George benar tetapi tidak berhasil dalam beberapa kasus.
Jawaban oleh Marco HC menggunakan Runnable yang merupakan upaya terakhir karena beban CPU tambahan.

Jawabannya adalah - Anda cukup memilih tempat yang benar untuk dipanggil ke setSelection () , misalnya berfungsi untuk saya:

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

    yourSpinner.setSelection(pos);
 }

Tapi itu tidak akan berfungsi di onCreateView () . Saya menduga itulah alasan ketertarikan pada topik ini.

Rahasianya adalah bahwa dengan Android Anda tidak dapat melakukan apa pun yang Anda inginkan dalam metode apa pun - oops :( - komponen mungkin tidak siap. Sebagai contoh lain - Anda tidak dapat menggulir ScrollView baik di onCreateView () maupun di onResume () ( lihat jawabannya di sini )

sberezin
sumber
Terima kasih - Saya tidak tahu Fragmen memiliki metode onResume.
ToolmakerSteve
Saya akan saya bisa memberikan +18 sehingga jawaban Anda akan di atas @ Mars HC. Anda adalah satu-satunya yang mencoba melakukan hal-hal dengan cara yang seharusnya dilakukan
vedant
15

Untuk menemukan nilai dan memilihnya:

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;
        }
    }
}
Ferran Maylinch
sumber
12

Mengapa Anda tidak menggunakan nilai Anda dari DB dan menyimpannya di ArrayList dan kemudian gunakan saja:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
RicardoSousaDev
sumber
1
Berbagai solusi menggunakan DataAdapter tidak berfungsi untuk saya, tetapi menggunakan ArrayList tempat nilai-nilai dibangun dari dalam sampel ini melakukan trik.
ewall
8

Solusi optimal adalah:

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

Untuk mendapatkan posisi item secara otomatis tambahkan pernyataan berikut

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
Naham Al-Zuhairi
sumber
7

Anda dapat membuat metode generik untuk jenis pekerjaan ini seperti yang saya lakukan di UtilityClass saya

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);
        }
    }
}
ZygoteInit
sumber
5

Anda dapat dengan mudah mengatur seperti ini spinner.setSelection(1):, alih-alih 1, Anda dapat mengatur posisi daftar apa pun yang ingin Anda tampilkan.

Vadim Kotov
sumber
4

Saya memiliki SimpleCursorAdapter jadi saya harus menduplikasi data untuk menggunakan respose di posting ini. Jadi, saya sarankan Anda mencoba cara ini:

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

Saya pikir itu cara nyata

pazfernando
sumber
1
ya, dalam kasus SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) memberikan Cursor, yang dapat digunakan untuk mendapatkan kolom.
lalitm
3

Ini bekerja untuk saya.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
Arpit Patel
sumber
bagaimana dengan +1?
SHADOW.NET
Karena ini mulai dari 0 jadi kami harus menambahkan satu untuk mendapatkan jawaban yang benar
Arpit Patel
2

Jika Anda memiliki daftar kontak, Anda dapat melakukannya untuk ini:

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

Saya tahu itu sudah dijawab, tetapi kode sederhana untuk memilih satu item, sangat sederhana:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
Dante
sumber
2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
Julio Cezar Riffel
sumber
4
Bisakah Anda menambahkan sedikit teks untuk menjelaskan jawaban Anda?
Kmeixner
2

Ini dinyatakan dalam komentar di tempat lain di halaman ini, tetapi dianggap bermanfaat untuk menariknya ke dalam jawaban:

Bila menggunakan adaptor, saya telah menemukan bahwa spinnerObject.setSelection(INDEX_OF_CATEGORY2)kebutuhan terjadi setelah para setAdapterpanggilan; jika tidak, item pertama selalu menjadi pilihan awal.

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

Ini dikonfirmasi dengan meninjau kode AbsSpinner untuk setAdapter.

Andy
sumber
Tentu saja, Anda dapat memilih item hanya setelah adaptor diisi.
CoolMind
2

Inilah yang saya gunakan di Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
Donny Rozendal
sumber
jika indexOftidak dapat membuat kecocokan, maka itu kembali -1, yang tampaknya menghasilkan nilai default yang dipilih oleh spinner.setSelection. Saya setuju dengan itu.
lasec0203
0

Dalam kasus saya, kode ini menghemat hari saya:

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;
        }
    }
}
Juan Pablo
sumber
Anda tidak perlu melakukan ini. adaptor memiliki panggilan getPosition (item) yang mengembalikan posisi int.
tzg
0

Sebagian besar waktu spinner.setSelection(i); //i is 0 to (size-1) of adapter's size tidak bekerja. Jika Anda baru saja meneleponspinner.setSelection(i);

Itu tergantung pada logika Anda.

Jika tampilan terisi penuh dan Anda ingin memanggilnya dari antarmuka, saya sarankan Anda menelepon

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

Atau jika Anda ingin mengubah siklus aktivitas / fragmen, panggil seperti ini

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

Saya telah membuat beberapa fungsi ekstensi Spinneruntuk memuat data dan melacak pemilihan item.

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

Contoh penggunaan

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
}
Sagar Chapagain
sumber
-1

Ini bekerja untuk saya:

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

Ini mirip dengan solusi @ sberezin tetapi memanggil setSelection () di onStart ().

JosinMC
sumber
-1

Saya memiliki masalah yang sama sejak kemarin. Sayangnya item pertama dalam daftar array ditampilkan secara default di widget pemintal. Perputarannya adalah menemukan item yang dipilih sebelumnya dengan setiap elemen dalam daftar array dan menukar posisinya dengan elemen pertama. Ini kodenya.

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;
    }
Vikhyat Chandra
sumber