प्रोग्रामर के चयनित आइटम को प्रोग्रामेटिक रूप से सेट करें


384

मैं एक एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं और मैं एक स्पिनर का उपयोग कर रहा हूं जो एक सरणी एडेप्टर का उपयोग करता है जो डेटाबेस से आबादी है।

मुझे यह पता नहीं चल सकता है कि मैं चयनित आइटम को सूची से प्रोग्रामेटिक रूप से कैसे सेट कर सकता हूं। उदाहरण के लिए, यदि स्पिनर में मेरे पास निम्नलिखित आइटम हैं:

  • श्रेणी 1
  • श्रेणी 2
  • श्रेणी 3

जब स्क्रीन बनाई जाएगी तो मैं प्रोग्राम 2 को चयनित आइटम कैसे बनाऊंगा। मैं सोच रहा था कि यह c # IE स्पिनर के समान हो सकता है। SlectlectText = "श्रेणी 2", लेकिन एंड्रॉइड के लिए इसके समान कोई विधि प्रतीत नहीं होती है।


कृपया इस लिंक का अनुसरण करें: [स्पिनर आइटम पर चयन कैसे सेट करें] [1] [१]: stackoverflow.com/questions/16358563/…
मैडी

1
आप अपने इंडेक्स को पास कर सकते हैं spinner.setSelection()। यह ठीक काम करेगा। आप एक विधि भी बना सकते हैं जो आपके अनुक्रमणिका को उनके वास्तविक तार से मिलाने में आपकी मदद कर सके।
तस्लीम ओसेनी

जवाबों:


736

निम्नलिखित का उपयोग करें: spinnerObject.setSelection(INDEX_OF_CATEGORY2)


285
धन्यवाद, यह बहुत अच्छा काम किया, जबकि मैं यह कर रहा था मैंने भी एडाप्टर के माध्यम से लूप की आवश्यकता के बिना सूचकांक प्राप्त करने का एक तरीका पाया। मैंने निम्नलिखित का उपयोग कियाmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
बोर्डी

85
यदि आपके पास संदर्भ के लिए एडाप्टर नहीं है। mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()) getPosition ( "मूल्य")।);
कलल वेड

3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1; 0: adapter.getPosition (mUser.getGender ()));
गूफीहेड

CallSelection () को setAdapter के बाद () हमेशा 1 आइटम प्रदर्शित करना प्रतीत होता है (एंड्रॉइड 2.3), यहां तक ​​कि अच्छे वाले को dropView में चुना जाता है। view.post () (@Marco Hernaiz Cao answer) जोड़कर इसे मेरे लिए ठीक करें।
मसीह

3
यह काम नहीं करता है अगर स्पिनर के पास onItemSelectedListener () हो। श्रोता को नहीं बुलाया जाएगा।
डॉन लैरिंक्स

79

इनमें से किसी भी जवाब ने मुझे समाधान नहीं दिया, केवल इसके साथ काम किया:

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

3
मैं सेट एडेप्टर () के बाद ही सेटसिएशन () कहता हूं। यह हमेशा 1 आइटम (एंड्रॉइड 2.3) प्रदर्शित करता है, यहां तक ​​कि अच्छा भी ड्रॉपव्यू में चुना जाता है। आपके समाधान ने मेरे लिए किया।
मसीह

2
धन्यवाद, यह काम किया! btw ListView.post.run () performItemClick () के लिए भी काम करता है
माइकल डी।

मैं आकार के आधार पर अंतिम एक का चयन कैसे कर सकता हूं?
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जो मुझे लगता है कि वह एक स्ट्रिंग है (यह मानते हुए कि उसने प्रयोग करने की कोशिश की है Spinner.SelectedText = "Category 2") लेकिन उपरोक्त कोड a के लिए है long
अरुण जॉर्ज

वह डेटाबेस से श्रेणियों को आबाद कर रहा है प्रत्येक श्रेणी के लिए एक आईडी होना चाहिए।
याकूब अहमद

1
क्यों मान लें कि यह एक CursorAdapter है? स्पिनरएड एडाप्टर बस के रूप में अच्छी तरह से काम करता है।
ग्रेग एनिस

मुझे लगता है कि आपके यहाँ एक गलती है, यह होना चाहिए adapter.getItem(position), नहीं adapter.getItemId(position)
वादिम कोटोव

29

कुछ स्पष्टीकरण (कम से कम Fragments के लिए - कभी भी शुद्ध गतिविधि के साथ आज़माया नहीं गया)। आशा है कि यह किसी को एंड्रॉइड को बेहतर ढंग से समझने में मदद करता है।

अरुण जॉर्ज द्वारा सबसे लोकप्रिय उत्तर सही है लेकिन कुछ मामलों में काम नहीं करते हैं। मार्को एचसी
द्वारा जवाब रननीयेबल विच का उपयोग करता है जो अतिरिक्त सीपीयू लोड के कारण अंतिम उपाय है।

जवाब है - आपको सेटसेलेक्शन () पर कॉल करने के लिए बस सही जगह चुननी चाहिए , उदाहरण के लिए यह मेरे लिए काम करती है:

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

    yourSpinner.setSelection(pos);
 }

लेकिन यह onCreateView () में काम नहीं करेगा । मुझे संदेह है कि इस विषय के लिए रुचि का कारण है।

रहस्य यह है कि एंड्रॉइड के साथ आप किसी भी तरीके से कुछ भी नहीं कर सकते हैं - उफ़ :( घटक अभी तैयार नहीं हो सकते हैं। एक अन्य उदाहरण के रूप में - आप स्क्रॉल दृश्य को न तो onCreateView () और न ही onResume () में स्क्रॉल कर सकते हैं इसका जवाब यहां देखें )


धन्यवाद - मुझे नहीं पता था कि Fragments के पास Resume विधि थी।
टूलमेकरसैट

मैं +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

आप DB से अपने मूल्यों का उपयोग क्यों नहीं करते हैं और उन्हें एक ArrayList पर संग्रहीत करते हैं और फिर बस उपयोग करते हैं:

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

1
DataAdapter का उपयोग करने वाले विभिन्न समाधान मेरे लिए काम नहीं करते थे, लेकिन ArrayList का उपयोग करते हुए कि इस नमूने में मूल्यों का निर्माण किया गया था।
इवल

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

आप इस तरह के काम के लिए एक सामान्य विधि बना सकते हैं जैसा कि मैं अपने यूटिलिटीक्लास में करता हूं जो है

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 है, इसलिए मुझे इस पोस्ट में रिस्पॉन्स का उपयोग करने के लिए डेटा को डुप्लिकेट करना होगा। तो, मैं आपको इस तरह से प्रयास करने की सलाह देता हूं:

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) एक कर्सर देता है, जिसका उपयोग कॉलम प्राप्त करने के लिए किया जा सकता है।
लालित्य


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

यह इस पृष्ठ पर कहीं और टिप्पणियों में कहा गया है, लेकिन इसे एक उत्तर में बाहर निकालना उपयोगी माना गया है:

एक एडाप्टर का उपयोग कर, मुझे लगता है कि मिल गया है spinnerObject.setSelection(INDEX_OF_CATEGORY2)की जरूरत होने के लिये के बादsetAdapter कॉल; अन्यथा, पहला आइटम हमेशा प्रारंभिक चयन होता है।

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

यह AbsSpinner की समीक्षा करके पुष्टि की है कोड के लिए setAdapter


बेशक, आप एडॉप्टर भर जाने के बाद ही किसी आइटम का चयन कर सकते हैं।
कूलमाइंड

2

यह मैं कोटलिन में उपयोग करता हूं:

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

यदि indexOfवह मेल नहीं खा सकता है, तो वह वापस आ जाता है -1, जिसके परिणामस्वरूप डिफ़ॉल्ट मान द्वारा चयनित होना दिखाई देता है spinner.setSelection। आई 'म ओके विद दैट।
लेसिक ०२०१२

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

आपको ऐसा करने की आवश्यकता नहीं है। एडेप्टर में एक गेटपोजिशन (आइटम) कॉल है जो इंट पोजीशन देता है।
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 के समाधान के समान है, लेकिन ऑनस्टार्ट () में कॉलिंग सेटिसलेशन () है।


-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;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.