2010-03-03 33 views
14

Tôi đang tạo một spinner và tôi đã thêm OnItemSelectedListener vào đó. Tuy nhiên tôi đã nhận thấy rằng nó cháy khi tạo. Bây giờ tôi đã tự hỏi nếu có một cách để bỏ qua/loại bỏ nó.bỏ qua OnItemSelectedListener kích hoạt khi tạo

Tôi biết tôi có thể sử dụng giá trị boolean, nhưng đó là một chút "bẩn".

Trả lời

0

Nếu có ai khác gặp phải câu hỏi này, bạn có thể xem xét a related question I asked a while ago, có một số câu trả lời với các ý tưởng hay về cách khắc phục sự cố này.

+0

Tôi gặp vấn đề khác với người nghe. nếu tôi kích hoạt một nhiệm vụ async từ phương thức OnItemSelected, và sau đó xoay getLastNonConfigurationInstance sẽ rút lại null cho tác vụ tôi lưu tại onRetainNonConfigurationInstance. Nhưng nếu tôi đặt mã bên ngoài trong oncreate nó sẽ làm việc tốt .... – Maxrunner

+0

bạn đã không nói với bạn đang chỉ cho chúng tôi 2 câu trả lời của bạn quá. – cosmincalistru

+3

@cosmincalistru: Đã sửa lỗi liên kết - Tôi vừa sao chép đã dán nội dung vào URL trình duyệt của mình vào thời điểm đó, không nhận ra đó là câu trả lời thay vì câu hỏi. Có lẽ, trong thời gian, tôi sẽ đến để tha thứ cho bản thân mình. –

1

Bạn không nên cố gắng ngăn chặn cuộc gọi đến số OnItemSelectedListener.

Theo mặc định, Trình quay của Android chọn mục đầu tiên được Bộ điều hợp trả về và do đó, OnItemSelectedListener được gọi để kích hoạt một số thao tác trên mục đó.

Tôi khuyên rằng mục đầu tiên trong Bộ điều hợp Spinner là một mục trống và OnItemSelectedListener của bạn có thể bỏ qua mục trống đó dựa trên id của nó.

2

Đây là giải pháp của tôi.

Tôi cần phải bỏ qua sự kiện lựa chọn mục đầu tiên vì có sự phụ thuộc giữa Tuyến đường cấp Spinner và Hộp kiểm tuyến.

Và tất cả các điều khiển của tôi đều được thiết lập dựa trên lượt truy cập trước đó vào hoạt động.

// Used to count the number of times the onItemSelected gets fired 
private int mGradeSelectionCount = 0; 

private void attachHandlers() { 
    OnItemSelectedListener gradeRangeSelectionMadeListener; 
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { 
      // If the counter is 0 then we can assume that it is android firing the event 
      if (mGradeSelectionCount++ < 1) { 
       return; 
      } 
      if (mCmbGradeFrom.getSelectedItemPosition() == 0) { 
       // Uncheck the Route checkbox 
       mChkTypeRoute.setChecked(false); 
      } else { 
       // Check the Route checkbox 
       mChkTypeRoute.setChecked(true); 
      } 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // Dont care, keep the same values as before 

     } 
    }; 
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener); 
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       mCmbGradeFrom.setSelection(0); 
       mCmbGradeTo.setSelection(0); 
      } 
     } 
    }); 
} 
1

Điều này có thể giúp bạn.

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
    if(view!=null && view.getId()!=0){ 
     //do your code here to avoid callback twice 
    } 
} 
+0

Đã không hoạt động :-( – sourcerebels

0

Vâng, tôi nghĩ rằng tôi đã tìm thấy giải pháp tốt đẹp đối với tôi, tôi đã có nó trong tâm trí từ đầu nhưng ... Tôi đã tùy chỉnh wrapper class dựa trên Handler android, đó được gọi là DoLater, và cũng có tùy chỉnh Adaptor dựa trên Listener vì vậy bạn không thể sao chép dán này nhưng bạn sẽ nhận được ý tưởng. Điều nguy hiểm chỉ là bằng cách nào đó chậm trễ 500 có thể dài và View có thể đã bị phá hủy (khi người dùng thực hiện một số công cụ có dây một cách nhanh chóng hoặc điện thoại bị chậm ...) DoLater quan tâm đến điều đó nên nó không được gọi khi hoạt động không được tiếp tục. Nhưng cách này OnItemSelectedListener không được kích hoạt khi tạo.

public void onResume() { 
    super.onResume(); 
    new DoLater(this, 500) { 
       public void run() { 
        new OnSpinnerSelectedAdapter(getBowSpinner()) { 
         protected void onItemSelected(int position) { 
          onBowSelected(position); 
         } 
        }; 
       } 
      }; 
} 
Các vấn đề liên quan