2011-11-21 19 views
12

मैंने onItemSelected interation कि काम करता है, लेकिन कैसे एपीआई विनिर्देश का कहना है के साथ एक स्पिनर:स्पिनर onItemSelected पहले से ही चयनित

इसके लिए कॉलबैक शुरू हो जाती है नए चयनित स्थिति से पहले से चयनित अलग है केवल जब स्थिति या यदि कोई चयनित आइटम नहीं था।

मुझे इस सीमा को हटाने की आवश्यकता है और मैं चाहता हूं कि उपयोगकर्ता एक ही तत्व का चयन करने पर भी कॉलबैक लागू किया जाए। यह कैसे करें? मैंने स्पिनर वर्ग को विस्तारित करने के बारे में एक सुझाव पढ़ा और स्थिति को INVALID_POSITION पर सेट किया, लेकिन मुझे ऐसा करने में सक्षम/सक्षम नहीं हुआ है। किसी ने भी वही किया?

+3

इच्छा है कि मैं इस प्रश्न को 1000 बार बढ़ा सकता हूं। और मेरी इच्छा है कि एक सभ्य उत्तर था। कोशिश करने और इस बेवकूफ सीमा के चारों ओर घूमने के लिए घंटों के लिए खोज कर रहे थे। – aaronsnoswell

+0

http://stackoverflow.com/a/11323043/2798289 – Govind

उत्तर

0

आप इसे कस्टम एडाप्टर द्वारा कर सकते हैं, जैसे कि अपनी इच्छा दृश्यों का एक लेआउट बनाएं, फिर कस्टम एडाप्टर में इसे बढ़ाएं, फिर ITemClick फ़ंक्शन पर आप इस फ़ंक्शन द्वारा दृश्य प्राप्त कर सकते हैं।

प्रत्येक दृश्य को अलग करने के लिए आपको प्रत्येक पंक्ति का टैग सेट करना होगा।

यह शायद आपकी स्थिति में काम करता है।

मुझे किसी भी मुद्दे को बताएं कि क्या आप

-2

है मुझे लगता है कि आप एक चर में मूल्य भंडारण किया जाना चाहिए, -1 के साथ vairable प्रारंभ करते हैं। और मान को बदलें क्योंकि उपयोगकर्ता आइटम स्पिनर का चयन करता है, यदि मान -1 है तो उपयोगकर्ता को शोध करने के लिए कहें या जो कुछ भी आप चाहते हैं।

@i चाहते हैं कि कॉलबैक भी लागू किया जाए यदि उपयोगकर्ता एक ही तत्व का चयन करता है। एंड्रॉइड आपके लिए यह करेगा क्योंकि यह एंड्रॉइड का डिफ़ॉल्ट व्यवहार है।

+3

"एंड्रॉइड यह आपके लिए करेगा क्योंकि यह एंड्रॉइड का डिफ़ॉल्ट व्यवहार है।" यह निश्चित रूप से डिफ़ॉल्ट व्यवहार नहीं है। जब आप पहले से हाइलाइट किए गए चयन पर क्लिक करते हैं तो डिफ़ॉल्ट (अजीब रूप से) * ईवेंट को ट्रिगर नहीं करता है। – Carol

0

आपने फिर से चयनित आइटम का चयन क्यों किया है। अगर आप फिर से कार्य करना चाहते हैं तो बस एक ताज़ा बटन दें।

+0

मेरे मामले में मैं उस घटना को रोकता हूं जिस पर इसे क्रेट विधि पर निकाल दिया गया है, तो मेरा स्पिनर इसे पहले तत्व पर सेट किया गया है। अगर मुझे इसे चुनने की ज़रूरत है, तो मैं इस सीमा के साथ नहीं कर सकता। – jedi

0

यह कस्टम संवाद मोड और साथ स्पिनर तत्व है whitout शीघ्र:

<Spinner 
    android:id="@+id/spinner_metatag" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:entries="@array/search_adv" 
/> 

सरणी तत्व जहां डिफ़ॉल्ट मान स्थिति 0 पर putted है:

<string-array name="search_adv"> 
    <item>@string/search_adv_prompt</item> 
    <item>@string/search_adv_title</item> 
    <item>@string/search_adv_desc</item> 
    <item>@string/search_adv_autore</item> 
    .... 
</string-array> 

सरणी के लिए स्ट्रिंग तत्वों डिफ़ॉल्ट मान के साथ:

<string name="search_adv_prompt">Scegli un metatag</string> <!-- Default value--> 
<string name="search_adv_title">Titolo</string> 
<string name="search_adv_desc">Descrizione</string> 
<string name="search_adv_autore">Autore</string> 
... 

और यहां पर कोड को निकालने के लिए कोड को रोकने के लिए कोड teMethod और पहले से ही चयनित तत्व का चयन करने के लिए अनुमति देने के लिए कार्य:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.search_adv_main); 

    spinner = (Spinner) findViewById(R.id.spinner_metatag); 

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) { 
      //prevent onCreate event fire and the loop 
      if(pos==0) 
       return; 

      //HERE YOUR CODE 

      //at the end move to the default element the spinner 
      spinner.setSelection(0); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) {} 
    }); 
} 

आशा मदद करता है। यह विचार TreKing's answer

0

आइटम पर चयन किए गए OnItemClickListener का उपयोग करें। चयनित चयनकर्ता के बजाय यह प्रत्येक क्लिक के लिए काम करेगा चाहे वह समान या अलग हो।

+3

यह बिल्कुल काम नहीं करेगा। स्पिनर पर एक OnItemClickListener की स्थापना एक अपवाद फेंकता है! –

+0

क्या आप कृपया मुझे बता सकते हैं कि अपवाद ..? – Athul

+2

http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener) यह रनटाइम अपवाद है। –

1

मुझे इस समस्या का समाधान भी चाहिए। मैं जो करना चाहता था वह एक स्पिनर था जिसमें दिनांक सीमा सीमा विकल्प के साथ है।पंक्तियों कुछ इस तरह दिखेगा:

अप्रैल 10 - 10 मई
मार्च 10 - अप्रैल 10
फ़र, 10 - मार्च 10
कस्टम रेंज

समस्या यह है कि उपयोगकर्ता एक कस्टम का चयन करता है, तो रेंज और फिर अपनी कस्टम रेंज बदलना चाहती है, उन्हें एक अलग रेंज का चयन करना होगा और फिर कस्टम रेंज विकल्प का चयन करना होगा। मैं चाहता था कि उपयोगकर्ता फिर से "कस्टम रेंज" का चयन करने में सक्षम हो ताकि कस्टम रेंज संवाद फिर से दिखाया जा सके।

मैं उप-वर्गीकृत स्पिनर और अपना खुद का श्रोता बनाया। कोड चयन को स्विच करता है, लेकिन फिर तुरंत इसे स्विच करता है ताकि कुछ भी नहीं चुना जा सके। मेरे श्रोता में मैं शून्य से कम किसी भी स्थिति को अनदेखा करता हूं।

स्पिनर बस अंतिम चयनित आइटम प्रदर्शित करता है। मैंने अपना खुद का कस्टम एडाप्टर बनाया और निर्दिष्ट किया कि प्रत्येक दृश्य के लिए क्या प्रदर्शित करना है, लेकिन यह आवश्यक नहीं होना चाहिए। यहां बताया गया है कि मैं कैसे उप-वर्गीकृत स्पिनर।

package com.example.widget; 

import android.content.Context; 
import android.widget.Spinner; 

public class DateRangeSpinner extends Spinner { 

private ItemSelectionListener listener; 

public DateRangeSpinner(Context context) { 
    super(context); 
} 

/** 
* This listener will be fired every time an item is selected, 
* regardless of whether it has already been selected or not. 
* 
* @param l 
*/ 
public void setOnItemSelectedListener(ItemSelectionListener l) { 
    listener = l; 
} 

public void removeOnItemSelectedListener() { 
    listener = null; 
} 

@Override 
public void setSelection(int position) { 
    setSelection(position, true); 
} 

@Override 
public void setSelection(int position, boolean animate) { 
    if (listener != null) { 
     listener.onItemSelected(position); 
    } 
    super.setSelection(position, animate); 
    super.setSelection(-1, animate); 
} 

public interface ItemSelectionListener { 
    public void onItemSelected(int position); 
} 

} 

मुझे आशा है कि इससे मदद मिलती है!

संबंधित मुद्दे