ตั้งค่ารายการที่เลือกของสปินเนอร์โดยทางโปรแกรม


384

ฉันกำลังทำงานในโครงการ Android และฉันใช้ตัวหมุนซึ่งใช้อะแดปเตอร์แบบอาร์เรย์ซึ่งบรรจุจากฐานข้อมูล

ฉันไม่สามารถค้นหาวิธีตั้งค่ารายการที่เลือกโดยทางโปรแกรมจากรายการ ตัวอย่างเช่นถ้าในเครื่องปั่นด้ายฉันมีรายการต่อไปนี้:

  • ประเภทที่ 1
  • ประเภทที่ 2
  • ประเภทที่ 3

ฉันจะทำให้หมวด 2 เป็นรายการที่เลือกโดยทางโปรแกรมอย่างไรเมื่อสร้างหน้าจอขึ้น ฉันคิดว่ามันอาจจะคล้ายกับ c # IE Spinner.SelectedText = "Category 2" แต่ดูเหมือนจะไม่มีวิธีการใดที่คล้ายกับวิธีนี้สำหรับ Android


โปรดไปที่ลิงค์นี้: [วิธีการตั้งค่าการเลือกในรายการสปินเนอร์] [1] [1]: stackoverflow.com/questions/16358563//
แมดดี้

1
spinner.setSelection()คุณสามารถส่งผ่านดัชนีของคุณลงใน ที่จะทำงานได้ดี คุณยังสามารถสร้างวิธีที่ช่วยให้คุณจับคู่ดัชนีของคุณกับสตริงที่แท้จริง
Taslim Oseni

คำตอบ:


737

ใช้สิ่งต่อไปนี้: spinnerObject.setSelection(INDEX_OF_CATEGORY2).


285
ขอบคุณนี้ใช้งานได้ดีในขณะที่ฉันกำลังทำสิ่งนี้ฉันยังพบวิธีรับดัชนีโดยไม่จำเป็นต้องวนซ้ำผ่านอะแดปเตอร์ ฉันใช้สิ่งต่อไปนี้mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

85
ในกรณีที่คุณไม่มีอะแดปเตอร์ที่จะอ้างอิง mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()) getPosition ( "Value").);
Kalel Wade

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

เรียก SetSelection () หลังจาก setAdapter () ดูเหมือนจะแสดงรายการที่ 1 เสมอ (Android 2.3) แม้จะเลือกรายการที่ดีใน dropView เพิ่ม view.post () (@Marco Hernaiz Cao คำตอบ) แก้ไขให้ฉัน
คริสต์

3
สิ่งนี้ไม่ทำงานหากสปินเนอร์มี onItemSelectedListener () ผู้ฟังจะไม่ถูกเรียก
Don Larynx

79

ไม่มีคำตอบข้อใดข้อหนึ่งที่ให้ทางออกแก่ฉันทำงานกับสิ่งนี้ได้เท่านั้น:

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

3
ฉันเรียก SetSelection () หลัง setAdapter () รายการนี้แสดงรายการที่ 1 เสมอ (Android 2.3) แม้จะเลือกรายการที่ดีใน dropView ทางออกของคุณทำเพื่อฉัน
คริสต์

2
ขอบคุณที่ใช้งานได้! btw ทำงานกับ ListView.post.run () performItemClick () เช่นกัน
Michael D.

ฉันจะเลือกอันสุดท้ายตามขนาดได้อย่างไร
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;
        }
    }
}

คุณสามารถใช้ข้างต้นเช่น:

selectSpinnerItemByValue(spinnerObject, desiredValue);

และแน่นอนว่าคุณสามารถเลือกตามดัชนีได้โดยตรงเช่น

spinnerObject.setSelection(index);

เกิดข้อผิดพลาดที่มีรหัสนี้ก็คือว่า @Boardy ต้องการเลือกCategory 2ซึ่งผมคิดว่าเป็น String (สมมติว่าเขาพยายามใช้Spinner.SelectedText = "Category 2") longแต่โค้ดข้างต้นเป็นราคาสำหรับ
อรุณจอร์จ

เขากำลังเติมหมวดหมู่จากฐานข้อมูลจะต้องมี ID สำหรับแต่ละหมวดหมู่
Yaqub Ahmad

1
ทำไมมันจึงเป็น CursorAdapter SpinnerAdapter ก็ใช้ได้เช่นกัน
เกร็กเอนนิส

ฉันคิดว่าคุณมีความผิดพลาดที่นี่มันควรจะเป็นไม่ได้adapter.getItem(position) adapter.getItemId(position)
Vadim Kotov

29

คำอธิบายบางอย่าง (อย่างน้อยสำหรับแฟรกเมนต์ - ไม่เคยลองด้วยกิจกรรมที่แท้จริง) หวังว่าจะช่วยให้บางคนเข้าใจ Android ได้ดีขึ้น

คำตอบที่นิยมมากที่สุดโดยอรุณจอร์จนั้นถูกต้อง แต่ไม่สามารถใช้งานได้ในบางกรณี
คำตอบโดยMarco HCใช้ Runnable ซึ่งเป็นทางเลือกสุดท้ายเนื่องจาก CPU โหลดเพิ่มเติม

คำตอบคือ - คุณควรเลือกสถานที่ที่ถูกต้องในการโทรไปที่ setSelection ()ตัวอย่างเช่นมันใช้ได้กับฉัน:

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

    yourSpinner.setSelection(pos);
 }

แต่มันจะไม่ทำงานใน onCreateView () ฉันสงสัยว่าเป็นเหตุผลของความสนใจในหัวข้อนี้

ความลับคือว่าสำหรับ Android คุณไม่สามารถทำสิ่งที่คุณต้องการในวิธีการใด ๆ - oops :( - ส่วนประกอบอาจไม่พร้อมตัวอย่างเช่น - คุณไม่สามารถเลื่อน ScrollView ทั้งใน onCreateView () และ onResume () ( ดูคำตอบได้ที่นี่ )


ขอบคุณ - ฉันไม่ทราบว่า Fragments มีวิธีการ onResume
ToolmakerSteve

ฉันจะให้ +18 เพื่อที่คำตอบของคุณจะอยู่เหนือ @Marco HC คุณเป็นคนเดียวที่พยายามทำสิ่งต่าง ๆ ในแบบที่มันควรจะทำ
vedant

15

ในการหาค่าและเลือก:

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

ทำไมคุณไม่ใช้ค่าของคุณจากฐานข้อมูลและเก็บไว้ใน ArrayList แล้วใช้:

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

1
วิธีการแก้ปัญหาต่าง ๆ ที่ใช้ DataAdapter ไม่ได้ผลสำหรับฉัน แต่การใช้ ArrayList ที่ค่าที่สร้างขึ้นจากในตัวอย่างนี้เป็นการหลอกลวง
eWall

8

ทางออกที่ดีที่สุดคือ:

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

7

คุณสามารถสร้างวิธีการทั่วไปสำหรับงานประเภทนี้ได้เช่นเดียวกับใน UtilityClass ของฉันซึ่งก็คือ

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

คุณสามารถตั้งค่าดังนี้: spinner.setSelection(1)แทนที่จะเป็น 1 คุณสามารถกำหนดตำแหน่งของรายการใด ๆ ที่คุณต้องการแสดง


4

ฉันมี SimpleCursorAdapter ดังนั้นฉันต้องทำซ้ำข้อมูลเพื่อใช้ respose ในโพสต์นี้ ดังนั้นฉันขอแนะนำให้คุณลองด้วยวิธีนี้:

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

ฉันคิดว่านั่นเป็นวิธีที่แท้จริง


1
ใช่ในกรณีของ SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) ให้ Cursor ซึ่งสามารถใช้เพื่อรับคอลัมน์
lalitm

3

นี่เป็นงานสำหรับฉัน

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

+1 เกี่ยวกับอะไร
SHADOW.NET

เพราะมันเริ่มต้นจาก 0 ดังนั้นเราต้องเพิ่มอีกอันเพื่อให้ได้คำตอบที่ถูกต้อง
Arpit Patel

2

หากคุณมีรายชื่อผู้ติดต่อคุณสามารถไปที่:

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

2

ฉันรู้ว่าตอบแล้ว แต่รหัสง่าย ๆ เพื่อเลือกหนึ่งรายการง่ายมาก:

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
คุณสามารถเพิ่มข้อความเพื่ออธิบายคำตอบของคุณได้ไหม?
Kmeixner

2

มีการระบุไว้ในความคิดเห็นที่อื่นในหน้านี้ แต่คิดว่ามีประโยชน์ในการดึงคำตอบออกมา:

เมื่อใช้อะแดปเตอร์ฉันพบว่าความspinnerObject.setSelection(INDEX_OF_CATEGORY2)ต้องการเกิดขึ้นหลังจากการsetAdapterโทร มิฉะนั้นรายการแรกจะเป็นตัวเลือกเริ่มต้นเสมอ

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

นี่คือการยืนยันโดยตรวจดู AbsSpinner รหัสsetAdapterสำหรับ


แน่นอนคุณสามารถเลือกรายการได้หลังจากเติมอะแดปเตอร์แล้วเท่านั้น
CoolMind

2

นี่คือสิ่งที่ฉันใช้ใน Kotlin:

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

ถ้าindexOfไม่สามารถทำให้การแข่งขันแล้วก็จะส่งกลับซึ่งดูเหมือนจะส่งผลให้ค่าเริ่มต้นที่ถูกเลือกโดย-1 spinner.setSelectionฉันโอเคกับสิ่งนั้น
lasec0203

0

ในกรณีของฉันรหัสนี้บันทึกวันของฉัน:

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

คุณไม่จำเป็นต้องทำสิ่งนี้ อะแดปเตอร์มีการเรียก getPosition (รายการ) ที่ส่งคืนตำแหน่ง int
tzg

0

เวลาส่วนใหญ่ใช้งาน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);
  }
});

0

ฉันได้ทำฟังก์ชั่นเสริมSpinnerสำหรับการโหลดข้อมูลและติดตามการเลือกรายการ

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

ตัวอย่าง Usaage

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

สิ่งนี้ใช้ได้กับฉัน:

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

มันคล้ายกับวิธีแก้ปัญหาของ @ sberezin แต่เรียกใช้ setSelection () ใน onStart ()


-1

ฉันมีปัญหาเดียวกันตั้งแต่เมื่อวานนี้ แต่น่าเสียดายที่รายการแรกในรายการอาเรย์จะแสดงตามค่าเริ่มต้นในวิดเจ็ตสปินเนอร์การฟื้นตัวจะเป็นการค้นหารายการที่เลือกก่อนหน้านี้กับแต่ละองค์ประกอบในรายการอาเรย์และสลับตำแหน่งกับองค์ประกอบแรก นี่คือรหัส

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;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.