2012-01-30 18 views
10

मैं वर्तमान में अपने एंड्रॉइड एप्लिकेशन के लिए खाता प्रबंधन गतिविधि पर काम कर रहा हूं और मुझे लगता है कि स्पिनर से setSelection() विधि क्यों स्पिनर से जुड़ी OnItemSlectedListener को ट्रिगर नहीं करती है ।Spinner.setSelection OnItemSelectedListener को ठीक से ट्रिगर नहीं करता है

यहाँ मैं वर्तमान में है;

OnCreate() विधि:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.account_management); 

    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

    retreiveLanguage(); 
    initializeUI(); 

    // Vérification si l'usager est déjà connecté 
    Globals appState = ((Globals) this.getApplication()); 
    boolean userLoggedIn = appState.isUserLoggedIn(); 
    boolean userInfoAvailable = appState.isUserInfoAvailable(); 

    if (userLoggedIn && userInfoAvailable) { 
     fillUI(); 
    } 
} 

विधि initializeUI() जो गतिविधि के निर्माण पर कहा जाता है से प्रासंगिक लाइनों जो श्रोता स्पिनर के बंधन से पता चलता:

/** OnItemSelectedHandler for the Country Spinner */ 
    mCountrySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

     public void onItemSelected(AdapterView<?> parent, View view, 
       int pos, long id) { 
      Log.i(TAG, "onCountrySelected() was called, position : " + pos); 

      mProvinces = new ArrayList<String>(); 
      mProvincesCode = new ArrayList<String>(); 

      mXML.parseResponse(FileManager.getInstance().getPortalOptions()); 

      for (int i = 0; i < mXML.getCountry(pos).sizeProvinces(); i++){ 
       mProvinces.add(mXML.getCountry(pos).getProvince(i).getLabel(mLanguage)); 
       mProvincesCode.add(mXML.getCountry(pos).getProvince(i).getCode()); 
      } 

      mProvinceArrayAdapter = new ArrayAdapter<String>(ManageAccountActivity.this, 
        android.R.layout.simple_spinner_item, mProvinces); 
      mProvinceArrayAdapter.setDropDownViewResource(
        android.R.layout.simple_spinner_dropdown_item); 
      mProvinceSpinner.setAdapter(mProvinceArrayAdapter); 
     } 

     public void onNothingSelected(AdapterView<?> arg0) { 
      // Do Nothing ...    
     } 
    }); 

और फिर एक और जोड़ी लाइन, इस बार fillUI विधि से():

Log.i(TAG, "Setting country based on user information."); 
((Spinner) findViewById(R.id.spin_country)) 
    .setSelection(mCountriesCode.indexOf(mUser.getCountry())); 
// TODO : Fix Provinces and States not being changed accordingly 
Log.i(TAG, "Setting province based on user information."); 
((Spinner) findViewById(R.id.spin_province)) 
    .setSelection(mProvincesCode.indexOf(mUser.getProvince())); 

तो थाई के साथ मैं fillII() विधि में चयन सेट करने के बाद OnItemSelectedListener को सही कहने के लिए कहूंगा, लेकिन यह नहीं है कि रनटाइम पर क्या हो रहा है: एस

यहां मेरा लॉगकट निकालना है जो दिखाता है कि श्रोता को तब नहीं कहा जाता है जब श्रोता को नहीं कहा जाता है चयन देश स्पिनर पर लागू होता है:

I/ManageAccountActivity (28108): उपयोगकर्ता जानकारी के आधार पर देश को सेट करना।

I/ManageAccountActivity (28108): उपयोगकर्ता जानकारी के आधार पर प्रांत सेट करना।

मैं/ManageAccountActivity (28108): onCountrySelected(), स्थिति बुलाया गया था: 1

एक प्रयोग के रूप में, मैं अपने गतिविधि के onStart विधि लेकिन वह didn में fillUI() कॉल डाल करने की कोशिश की ' टी बदल कैसे आवेदन प्रतिक्रिया व्यक्त की।

किसी भी संकेत दिए गए के लिए अग्रिम में या धन्यवाद, मदद युक्तियाँ!

.setSelection(mProvincesCode.indexOf(mUser.getProvince()), true); 

developers page से यह पता चलता है:

setSelection(int position, boolean animate) 
//Jump directly to a specific item in the adapter data. 
+0

, OnItemSlectedListener केवल तभी निकाल दिया जाता है जब आप स्पिनर पर कुछ कार्रवाई करते हैं .. –

+1

बदलने के लिए ठीक है, मैं इसे बदलता हूं ... चयन को 0 से 1 तक ले जाना नहीं माना जाएगा? –

उत्तर

19

आप स्पिनर दो तर्क का उपयोग करके, दूसरा एक बूलियन का उपयोग कर सेट करने की कोशिश की है

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

मैंने इसे एनिमेट तर्क के साथ झूठा होने की कोशिश की है (इसे किसी अन्य थ्रेड से मिला है) मैं तर्क को सही पर सेट करने के साथ कोशिश करूंगा। –

+3

बहुत बहुत धन्यवाद, मुझे इसे पहले स्थान पर सही करने की कोशिश करनी चाहिए: पी। दोनों स्पिनरों को सेट चयन (pos, true) में सेट करना चाल था। –

+0

गलत, सेटिंग 'एनिमेट' परम फायरिंग OnItemSelectedListener से जुड़ा हुआ नहीं है। –

3

बस निम्नलिखित कोड का उपयोग करें:

0

मुझे अपनी समस्या का समाधान ऑनक्रेट विधि में जोड़ने के लिए मिला। कार्यक्रम केवल पहले चयन के लिए लेकिन काम करता है। दूसरी बार मैं इस कार्यक्रम का चयन एमुलेटर दुर्घटनाओं।

spinner.setOnItemSelectedListener(this); 

enter image description here

+0

काम करता है। यह जवाब काम नहीं कर रहा है। कृपया इसे एक टिप्पणी के रूप में जोड़ें। – Arashsoft

0

मैंने पाया कि setSelection (पीओएस) काम करता है अगर आप

yourSpinner.setOnItemSelectedListener(null); 
कि पहले

घोषणा करते हैं।

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