Đặt mục đã chọn của spinner theo chương trình


384

Tôi đang làm việc trên một dự án Android và tôi đang sử dụng một công cụ quay vòng sử dụng bộ điều hợp mảng được điền từ cơ sở dữ liệu.

Tôi không thể tìm hiểu làm thế nào tôi có thể thiết lập mục được chọn theo chương trình từ danh sách. Ví dụ: nếu trong spinner tôi có các mục sau:

  • Loại 1
  • Loại 2
  • Loại 3

Làm thế nào để lập trình loại 2 trở thành mục được chọn khi màn hình được tạo. Tôi đã nghĩ rằng nó có thể giống với c # IE Spinner.SelectedText = "Loại 2" nhưng dường như không có bất kỳ phương pháp nào tương tự như phương pháp này cho Android.


Vui lòng theo liên kết sau: [Cách đặt lựa chọn trên mục spinner] [1] [1]: stackoverflow.com/questions/16358563/
Kẻ

1
Bạn có thể vượt qua chỉ số của bạn vào spinner.setSelection(). Điều đó sẽ làm việc tốt. Bạn cũng có thể tạo một phương thức có thể giúp bạn khớp các chỉ mục của bạn với các chuỗi thực tế của chúng.
TASlim Oseni

Câu trả lời:


737

Sử dụng như sau : spinnerObject.setSelection(INDEX_OF_CATEGORY2).


287
Cảm ơn, điều này đã làm việc rất tốt, trong khi tôi đang làm điều này, tôi cũng tìm thấy một cách để lấy chỉ mục mà không cần phải lặp qua bộ điều hợp. Tôi đã sử dụng như saumySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

86
trong trường hợp bạn không có bộ chuyển đổi để tham khảo. mySpinner.setSelection (((ArrayAd CHƯƠNG) mySpinner.getAd CHƯƠNG ()). getP vị trí ("Giá trị"));
Kalel Wade

3
sexSpinner.setSelection (adapter.getP vị trí (mUser.getGender ()) == -1? 0: adapter.getP vị trí (mUser.getGender ()));
Goofyahead

việc gọi SetSelection () ngay sau setAdOG () dường như luôn hiển thị mục đầu tiên (Android 2.3), ngay cả mục tốt cũng được chọn trong dropView. thêm view.post () (câu trả lời @Marco Hernaiz Cao) sửa nó cho tôi.
Chúa Kitô

3
Điều này không hoạt động nếu Spinner có onItemSelectedListener (). Người nghe sẽ không được gọi.
Don thanh quản

80

Không ai trong số những câu trả lời này cho tôi giải pháp, chỉ làm việc với điều này:

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

3
Tôi gọi SetSelection () ngay sau setAd CHƯƠNG (). Điều này luôn hiển thị mục đầu tiên (Android 2.3), ngay cả mục tốt được chọn trong dropView. Giải pháp của bạn đã làm điều đó cho tôi.
Chúa Kitô

2
Cảm ơn, đã làm việc! btw hoạt động cho ListView.post.run () biểu diễnItemClick ()
Michael D.

Làm thế nào tôi có thể chọn cái cuối cùng dựa trên kích thước?
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;
        }
    }
}

Bạn có thể sử dụng như trên:

selectSpinnerItemByValue(spinnerObject, desiredValue);

& tất nhiên bạn cũng có thể chọn theo chỉ mục trực tiếp như

spinnerObject.setSelection(index);

Một lỗi với mã này là @Boardy muốn lựa chọn Category 2mà tôi cho là Chuỗi (giả sử anh ta đã thử sử dụng Spinner.SelectedText = "Category 2") nhưng mã trên là cho a long.
Arun George

Anh ta đang điền các danh mục từ cơ sở dữ liệu phải có ID cho mỗi danh mục.
Yaqub Ahmad

1
Tại sao lại cho rằng đó là CthonAd CHƯƠNG? SpinnerAd CHƯƠNG cũng hoạt động tốt.
Greg Enni

Tôi nghĩ rằng bạn có một sai lầm ở đây, nó nên được adapter.getItem(position), không adapter.getItemId(position).
Vadim Kotov

29

Một số giải thích (ít nhất là cho Mảnh vỡ - không bao giờ thử với Hoạt động thuần túy). Hy vọng nó sẽ giúp ai đó hiểu rõ hơn về Android.

Câu trả lời phổ biến nhất của Arun George là đúng nhưng không hoạt động trong một số trường hợp.
Câu trả lời của Marco HC sử dụng Runnable wich là giải pháp cuối cùng do tải CPU bổ sung.

Câu trả lời là - bạn chỉ cần chọn đúng nơi để gọi tới setSelection () , ví dụ như nó hoạt động với tôi:

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

    yourSpinner.setSelection(pos);
 }

Nhưng nó sẽ không hoạt động trong onCreateView () . Tôi nghi ngờ đó là lý do cho sự quan tâm đến chủ đề này.

Bí mật là với Android, bạn không thể làm bất cứ điều gì bạn muốn trong bất kỳ phương thức nào - oops :( - các thành phần có thể chưa sẵn sàng. Như một ví dụ khác - bạn không thể cuộn ScrollView trong onCreateView () cũng như onResume () () xem câu trả lời ở đây )


Cảm ơn - Tôi không biết Fragment có phương pháp onResume.
ToolmakerSteve

Tôi sẽ có thể cho +18 để câu trả lời của bạn cao hơn @Marco HC. Bạn là người duy nhất cố gắng làm mọi thứ theo cách nó được thực hiện
vedant 18/03/2015

15

Để tìm một giá trị và chọn nó:

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

Tại sao bạn không sử dụng các giá trị của mình từ DB và lưu trữ chúng trên ArrayList và sau đó chỉ sử dụng:

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

1
Các giải pháp khác nhau khi sử dụng DataAd CHƯƠNG không hoạt động với tôi, nhưng sử dụng ArrayList mà các giá trị được tạo từ trong mẫu này đã tạo ra mẹo.
ewall

8

Giải pháp tối ưu là:

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

Để có được vị trí của mục tự động thêm câu lệnh sau

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

7

Bạn có thể tạo một phương thức chung cho loại công việc này như tôi làm trong UtilityClass của tôi, đó là

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

Bạn có thể dễ dàng đặt như thế này : spinner.setSelection(1), thay vì 1, bạn có thể đặt bất kỳ vị trí nào trong danh sách bạn muốn hiển thị.


4

Tôi có một SimpleCthonAd CHƯƠNG vì vậy tôi phải sao chép dữ liệu để sử dụng respose trong bài viết này. Vì vậy, tôi khuyên bạn nên thử theo cách này:

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

Tôi nghĩ đó là một cách thực sự


1
có, trong trường hợp SimpleC bổngAd CHƯƠNG, spinnerRegion.getItemIdAtP vị trí (i) đưa ra một Con trỏ, có thể được sử dụng để lấy các cột.
lalitm

3

Đây là công việc cho tôi.

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

Còn +1 thì sao?
SHADOW.NET

Bởi vì nó bắt đầu từ 0 nên chúng tôi phải thêm một câu để có câu trả lời đúng
Arpit Patel

2

Nếu bạn có một danh sách các địa chỉ liên lạc, bạn có thể đi đến đây:

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

2

Tôi biết điều đó đã được trả lời, nhưng mã đơn giản để chọn một mục, rất đơn giản:

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
Bạn có thể thêm một chút văn bản để giải thích câu trả lời của bạn?
Kmeixner

2

Điều này được nêu trong các bình luận ở nơi khác trên trang này nhưng nghĩ rằng nó hữu ích để đưa nó ra câu trả lời:

Khi sử dụng một bộ chuyển đổi, tôi đã phát hiện ra rằng spinnerObject.setSelection(INDEX_OF_CATEGORY2)cần phải xảy ra sau khi các setAdaptercuộc gọi; mặt khác, mục đầu tiên luôn là lựa chọn ban đầu.

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

Điều này được xác nhận bằng cách xem lại absSpinner cho setAdapter.


Tất nhiên, bạn chỉ có thể chọn một mục sau khi bộ điều hợp đã được lấp đầy.
CoolMind

2

Đây là những gì tôi sử dụng trong Kotlin:

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

nếu indexOfkhông thể thực hiện khớp, thì nó trả về -1, điều này dường như dẫn đến giá trị mặc định là giá trị được chọn bởi spinner.setSelection. Tôi ok với điều đó.
lasec0203

0

Trong trường hợp của tôi, mã này đã lưu ngày của tôi:

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

Bạn không cần phải làm điều này. bộ điều hợp có lệnh gọi getP vị trí (mục) trả về vị trí int.
tzg

0

Hầu hết thời gian spinner.setSelection(i); //i is 0 to (size-1) of adapter's size không hoạt động. Nếu bạn chỉ gọispinner.setSelection(i);

Nó phụ thuộc vào logic của bạn.

Nếu chế độ xem được tải đầy đủ và bạn muốn gọi nó từ giao diện, tôi khuyên bạn nên gọi

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

Hoặc nếu bạn muốn thay đổi giữa vòng đời hoạt động / phân đoạn, hãy gọi như thế này

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

0

Tôi đã thực hiện một số chức năng mở rộng của Spinner để tải dữ liệu và theo dõi lựa chọn mục.

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

Ví dụ về Hoa Kỳ

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

Điều này làm việc cho tôi:

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

Nó tương tự như giải pháp của @ sberezin nhưng gọi setSelection () trong onStart ().


-1

Tôi đã gặp vấn đề tương tự kể từ ngày hôm qua. Thật không may, mục đầu tiên trong danh sách mảng được hiển thị theo mặc định trong tiện ích con quay. Quay vòng sẽ là tìm mục đã chọn trước đó với từng phần tử trong danh sách mảng và hoán đổi vị trí của nó với phần tử đầu tiên. Đây là mã.

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;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.