Tôi đã tìm thấy giải pháp bằng cách mở rộng ArrayAdapter
và ghi đè phương pháp getView
.
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
/**
* A SpinnerAdapter which does not show the value of the initial selection initially,
* but an initialText.
* To use the spinner with initial selection instead call notifyDataSetChanged().
*/
public class SpinnerAdapterWithInitialText<T> extends ArrayAdapter<T> {
private Context context;
private int resource;
private boolean initialTextWasShown = false;
private String initialText = "Please select";
/**
* Constructor
*
* @param context The current context.
* @param resource The resource ID for a layout file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
public SpinnerAdapterWithInitialText(@NonNull Context context, int resource, @NonNull T[] objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
}
/**
* Returns whether the user has selected a spinner item, or if still the initial text is shown.
* @param spinner The spinner the SpinnerAdapterWithInitialText is assigned to.
* @return true if the user has selected a spinner item, false if not.
*/
public boolean selectionMade(Spinner spinner) {
return !((TextView)spinner.getSelectedView()).getText().toString().equals(initialText);
}
/**
* Returns a TextView with the initialText the first time getView is called.
* So the Spinner has an initialText which does not represent the selected item.
* To use the spinner with initial selection instead call notifyDataSetChanged(),
* after assigning the SpinnerAdapterWithInitialText.
*/
@Override
public View getView(int position, View recycle, ViewGroup container) {
if(initialTextWasShown) {
return super.getView(position, recycle, container);
} else {
initialTextWasShown = true;
LayoutInflater inflater = LayoutInflater.from(context);
final View view = inflater.inflate(resource, container, false);
((TextView) view).setText(initialText);
return view;
}
}
}
Android nào khi khởi tạo Spinner, gọi getView cho tất cả các mục trong T[] objects
. SpinnerAdapterWithInitialText
trả về số TextView
với số initialText
, lần đầu tiên được gọi. Tất cả các lần khác nó gọi super.getView
là phương pháp getView
của ArrayAdapter
được gọi nếu bạn đang sử dụng Spinner bình thường.
Để tìm hiểu xem người dùng đã chọn mục xoay hoặc nếu trình quay số vẫn hiển thị initialText
, hãy gọi selectionMade
và chuyển giao bộ xoay được bộ chuyển đổi.
[Kiểm tra câu hỏi này tương tự được hỏi ở đây] [1] [1]: http://stackoverflow.com/questions/867518/how-to-make-an-android -spinner-with-initial-text-select-one – Nargis
Bạn có thể tạo một ảnh chụp màn hình về thiết kế mong muốn của mình không? Cảm ơn – Jarvis