2010-09-03 42 views
6

Có vẻ như lớp Spinner của android (và có thể cả ListView nói chung, mặc dù tôi không biết chắc chắn) gọi phương thức onItemSelected() của OnItemSelectedListener sau khi bạn gọi setAdapter(), ngay cả khi người dùng chưa chọn bất kỳ điều gì.Làm thế nào để tránh việc có các mục chọn cuộc gọi spinner trên android khi thiết lập bộ điều hợp?

Tôi có thể thấy điều này sẽ hữu ích trong nhiều trường hợp, nhưng đôi khi tôi chỉ muốn onItemSelected() được gọi khi một mục thực sự được chọn cụ thể.

Có cách nào để kiểm soát hành vi này và có Spinner KHÔNG gọi onItemSelected() sau khi đặt bộ điều hợp không?

Trả lời

4

tôi đã không sử dụng giải pháp này cho rất dài được nêu ra vì vậy tôi không hoàn toàn tin tưởng rằng nó hoạt động như mong đợi, nhưng tôi đã có may mắn cho đến nay với cách giải quyết này:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     protected Adapter initializedAdapter = null; 

     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      // Always ignore the initial selection performed after setAdapter 
      if(initializedAdapter !=parent.getAdapter()) { 
       initializedAdapter = parent.getAdapter(); 
       return; 
      } 

      ... 
     } 
    } 

Có cách tốt hơn?

+2

Nếu người dùng nhấn mục đầu tiên mã trên không có hiệu lực. – matheuslf

+0

Vấn đề tương tự mà tôi đang gặp phải – theLazyFinder

0

Tôi đã sử dụng phương thức setTag và getTag và đã tạo một resource id được gọi là "spinnerstate".

Sau đó, bất cứ khi nào tôi đặt bộ điều hợp theo chương trình, tôi đặt thẻ "spinnerstate" thành "init" và trong sự kiện được kích hoạt, đặt nó thành "sẵn sàng" và bỏ qua sự kiện. (Lưu ý mã của tôi là Mono cho Android se nó sẽ trông khác):

Set Adaptor:

profileSpn.SetTag (Resource.Id.spinnerstate, "init"); 
profileSpn.Adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleSpinnerItem, items.ToArray()); 

Đã chọn mục sự kiện:

string state = (string)((Spinner)sender).GetTag (Resource.Id.spinnerstate); 
    if (state == "init") { 
     ((Spinner)sender).SetTag (Resource.Id.spinnerstate, "ready"); 
     return; 
    } 

Tôi đồng ý rằng đây không phải là mong muốn hành vi ở hầu hết 100% các trường hợp, và tôi không nghĩ rằng đó là thiết kế tốt trên một phần của Google, nhưng có bạn đi.

2

Thêm nghe để spinner như dưới đây:

spinner.post(new Runnable(){ 
    public void run() 
    { 
     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

       ... 
      } 
     } 
    } 
}); 
0

tôi đã làm những điều tương tự trước đây, tôi đã sử dụng giá trị đếm. Sử dụng đối tượng bộ điều hợp gốc không đầy đủ vì có thể là sự cố khi chế độ xem được làm mới hoặc gọi lại là getView().

Vì vậy, tôi khuyên bạn nên sử dụng mảng bộ đếm.

Lúc đầu, xác định mảng đếm trong bộ điều hợp toàn cầu.

private int isInitializedView[]; 

Và sau đó khởi tạo nó trên getView().

isInitializedView[position] = 0; 

Trong trình nghe lựa chọn, hãy làm điều gì đó bạn muốn nếu nó đã được khởi tạo.

holder.mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
      isInitializedView[position]++; 
      if(isInitializedView[position] > 1) { 
       // do someting that you want 
      } 
     } 

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

(Lưu ý rằng isInitializedView[position]++; có thể đến sau if() thói quen, và chỉ kích hoạt sự kiện khi giá trị này là >0. Đó là lựa chọn của bạn.)

0

Tôi có ba spinner trong hoạt động của tôi và tất cả dữ liệu spinner bộ chuyển đổi có được lấp đầy tại thời gian chạy (từ dữ liệu dịch vụ web sau khi gọi từ phương thức onCreate).Vì vậy, nó sẽ tự động gọi phương thức quay số onItemSelected(AdapterView<?> parent, View view, int position, long id). Tôi đã giải quyết vấn đề này bằng cách sử dụng phương pháp onUserInteraction() hoạt động kiểm tra phương thức này mà người dùng đang tương tác với spinner hay không. nếu có thì thực hiện các hành động khác không

  1. Khai isUserIntract boolean biến trên toàn cầu

  2. sử dụng phương pháp sau đây onItemSelected thủ tục

    Nếu (isUserIntract) {

    // thực hiện Hành động

    } else {

    // không thực hiện hành động

    } sử dụng

  3. dưới mã trong hoạt động

@ Override

public void onUserInteraction() { 
super.onUserInteraction(); 
isUserIntract = true; 
} 
Các vấn đề liên quan