2012-01-30 21 views
10

Tôi hiện đang làm việc trên Hoạt động quản lý tài khoản cho ứng dụng Android của mình và tôi đang gặp khó khăn trong việc tìm ra lý do tại sao phương pháp setSelection() từ trình quay không kích hoạt OnItemSelectedListener đính kèm với Spinner đã nói .Spinner.setSelection không kích hoạt OnItemSelectedListener đúng

Đây là những gì tôi hiện có;() Phương pháp

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

dòng thích hợp từ initializeUI() phương pháp được gọi là ngày thành lập của Hoạt động trong đó cho thấy sự gắn kết của các Spinner Listener:

/** 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 ...    
     } 
    }); 

Và một lần nữa một vài dòng khác, lần này từ phương thức 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())); 

Vì vậy, với thi Tôi mong đợi OnItemSelectedListener được gọi ngay sau khi tôi thiết lập lựa chọn trong phương thức fillUI(), nhưng đó không phải là những gì đang xảy ra trong thời gian chạy: S

Đây là phần trích xuất LogCat cho thấy Trình nghe không được gọi khi lựa chọn được áp dụng cho quốc gia spinner:

I/ManageAccountActivity (28108): Đặt quốc gia dựa trên thông tin người dùng.

I/ManageAccountActivity (28108): Đặt tỉnh dựa trên thông tin người dùng.

I/ManageAccountActivity (28.108): onCountrySelected() được gọi, vị trí: 1

Là một thử nghiệm, tôi cũng đã cố gắng đặt cuộc gọi fillUI() trong phương thức onStart của Hoạt động của tôi, nhưng didn rằng' t thay đổi cách ứng dụng phản ứng.

Cảm ơn trước cho bất kỳ gợi ý, trợ giúp hoặc mẹo nào!

+0

, OnItemSelectedListener chỉ được kích hoạt khi bạn thực hiện một số thao tác trên spinner..để thay đổi –

+1

Tôi cũng thay đổi ... di chuyển lựa chọn từ 0 đến 1 sẽ không được xem là thay đổi? –

Trả lời

19

Bạn đã cố gắng để thiết lập các spinner bằng cách sử dụng hai tham số, thứ hai sử dụng một boolean:

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

Từ developers page nó cho thấy:

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

Tôi đã thử nó với các đối số animate là sai (đã nhận nó từ một sợi khác) Tôi sẽ thử nó với các đối số được đặt thành true. –

+3

Cảm ơn rất nhiều, tôi đã cố gắng đặt nó thành sự thật ngay từ đầu: P. Thiết lập cả hai spinners 'để setSelection (pos, true) đã làm các trick. –

+0

Sai, đặt tham số 'animate' KHÔNG được kết nối với việc kích hoạt OnItemSelectedListener. –

3

Chỉ cần sử dụng đoạn mã sau:

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

Tôi đã tìm thấy giải pháp cho vấn đề của mình khi thêm phương thức này vào phương thức onCreate. Chương trình hoạt động nhưng chỉ dành cho lựa chọn đầu tiên. Lần thứ hai tôi chọn chương trình làm hỏng trình mô phỏng.

spinner.setOnItemSelectedListener(this); 

enter image description here

+0

Như bạn đã đề cập trong bài đăng của mình. Câu trả lời này không hoạt động. Vui lòng thêm nó làm nhận xét. – Arashsoft

0

tôi thấy rằng setSelection (pos) hoạt động nếu bạn khai báo

yourSpinner.setOnItemSelectedListener(null); 

trước đó.

Các vấn đề liên quan