2011-11-21 35 views
12

Tôi đã một Spinner với onItemSelected interation mà làm việc, nhưng làm thế nào các đặc điểm kỹ thuật Api nói:Spinner onItemSelected với mục đã chọn

callback này được gọi chỉ khi vị trí vừa được chọn là khác nhau từ đã chọn trước đó vị trí hoặc nếu không có mục đã chọn.

Tôi cần xóa giới hạn này và tôi muốn gọi lại cũng được gọi nếu người dùng chọn cùng một yếu tố. Làm thế nào để làm điều đó? Tôi đọc một gợi ý về việc mở rộng lớp Spinner và đặt vị trí thành INVALID_POSITION, nhưng tôi đã không hiểu/có thể làm điều đó. Bất cứ ai cũng làm điều tương tự?

+3

Ước gì tôi có thể upvote câu hỏi này 1000 lần. Và tôi ước có một câu trả lời tốt. Đã tìm kiếm hàng giờ để thử và vượt qua giới hạn ngu ngốc này. – aaronsnoswell

+0

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

Trả lời

0

Bạn có thể thực hiện điều này bằng bộ điều hợp tùy chỉnh, như tạo bố cục của chế độ xem mong muốn, sau đó tăng cấp độ này trong bộ điều hợp tùy chỉnh, sau đó trên chức năng onItemClick, bạn có thể xem bằng chức năng này.

Để phân biệt từng chế độ xem, bạn phải đặt thẻ của mỗi hàng.

Nó có thể hoạt động trong tình trạng của bạn.

Hãy cho tôi biết bất kỳ vấn đề nào nếu bạn có

-2

Tôi đoán bạn phải lưu trữ giá trị trong một biến, khởi tạo vai với -1. Và thay đổi giá trị khi người dùng chọn mục spinner, nếu giá trị là -1 yêu cầu người dùng chọn lại hoặc bất cứ điều gì bạn muốn.

@i cũng muốn gọi lại cũng được gọi nếu người dùng chọn cùng một phần tử. Android sẽ làm điều đó cho bạn vì đây là hành vi mặc định của Android.

+3

"Android sẽ làm điều đó cho bạn vì đây là hành vi mặc định của Android". Đó chắc chắn KHÔNG phải là hành vi mặc định. Mặc định là (lẻ), để * NOT * kích hoạt sự kiện ở tất cả, khi bạn bấm vào một vùng chọn đã được tô đậm. – Carol

0

lý do bạn chọn lại mục đã chọn. Chỉ cần cung cấp nút làm mới nếu bạn muốn thực hiện lại tác vụ đó.

+0

trong trường hợp của tôi, tôi ngăn chặn sự kiện được kích hoạt trên phương thức onCreate, sau đó trình quay của tôi được đặt trên phần tử đầu tiên. Nếu tôi cần phải chọn nó, tôi không thể với giới hạn này. – jedi

0

Đây là Element spinner với chế độ thoại tùy chỉnh và whitout Promt:

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

phần tử mảng trong đó giá trị mặc định được putted ở vị trí 0:

<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> 

Các yếu tố String cho mảng với giá trị mặc định:

<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> 
... 

Và ở đây mã để ngăn sự kiện được kích hoạt trên onCrea teMethod và công việc xung quanh để cho phép chọn cùng một yếu tố đã được chọn:

@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) {} 
    }); 
} 

Hy vọng sẽ giúp. Ý tưởng đến từ giải pháp thứ hai từ TreKing's answer

0

Sử dụng OnItemClickListener thay vì trên mụcSelectedListener.Điều đó sẽ hoạt động với mọi nhấp chuột cho dù đó là giống hay khác nhau.

+3

Điều đó sẽ không hoạt động chút nào. Đặt một OnItemClickListener trên Spinner ném một ngoại lệ! –

+0

bạn có thể cho tôi biết ngoại lệ nào không ..? – Athul

+2

http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener) Đó là RuntimeException. –

1

Tôi cũng cần một giải pháp cho vấn đề này. Những gì tôi muốn làm là có một Spinner có phạm vi ngày với tùy chọn phạm vi tùy chỉnh.Các hàng sẽ giống như thế này:

10 Tháng 4 - Tháng 10
10 Tháng ba - 10 tháng tư
10 Tháng Hai - 10 Tháng Ba
Phạm vi Tuỳ chỉnh

Vấn đề là nếu người sử dụng chọn một tùy chỉnh phạm vi và sau đó muốn thay đổi phạm vi tùy chỉnh của họ, họ phải chọn một phạm vi khác và sau đó chọn tùy chọn phạm vi tùy chỉnh một lần nữa. Tôi muốn người dùng chỉ có thể chọn "Phạm vi tùy chỉnh" một lần nữa để hộp thoại tùy chỉnh phạm vi có thể được hiển thị lại.

Tôi đã xếp loại Spinner và tạo trình xử lý riêng của mình. Mã sẽ chuyển vùng chọn, nhưng sau đó ngay lập tức chuyển đổi nó để không có gì được chọn. Trong trình nghe của tôi, tôi chỉ bỏ qua bất kỳ vị trí nào nhỏ hơn 0.

Spinner chỉ hiển thị mục được chọn cuối cùng. Tôi đã tạo bộ điều hợp tùy chỉnh của riêng tôi và chỉ định những gì để hiển thị cho mỗi chế độ xem, nhưng điều đó không cần thiết. Đây là cách tôi phân loại Spinner.

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

} 

Tôi hy vọng điều này sẽ hữu ích!

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