Tôi đang tìm cách ẩn một mục trong tiện ích con quay Android. Điều này sẽ cho phép bạn mô phỏng một vòng quay không có mục nào được chọn và đảm bảo rằng lệnh gọi lại onItemSelected () luôn được gọi cho mọi mục được chọn (nếu mục ẩn là "hiện tại"). Thông thường, luôn có một mục trong spinner không tạo lệnh gọi lại, cụ thể là mục hiện tại.
Có một số mã trên stackoverflow về cách vô hiệu hóa (chuyển sang màu xám) các mục, nhưng không phải cách ẩn các mục hoàn toàn như thể chúng không tồn tại.
Sau nhiều thử nghiệm, tôi đã đưa ra một giải pháp hack-ish có thể hoạt động trên nhiều nền tảng Android cũ và mới khác nhau. Nó có một số nhược điểm thẩm mỹ nhỏ mà khó nhận thấy. Tôi vẫn muốn biết một giải pháp chính thức hơn, ngoài việc "không làm điều đó với máy quay".
Điều này luôn ẩn mục đầu tiên trong spinner, nhưng khá dễ dàng được mở rộng để ẩn một mục tùy ý hoặc nhiều hơn một mục. Thêm một mục giả có chứa một chuỗi trống ở đầu danh sách các mục quay của bạn. Bạn có thể muốn đặt lựa chọn con quay hiện tại thành mục 0 trước khi hộp thoại con quay mở ra, điều này sẽ mô phỏng một con quay không được chọn.
Ví dụ thiết lập Spinner với ghi đè phương thức ArrayAdapter:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
tv.setVisibility(View.GONE);
dòng là không cần thiết. Nhận xét về nó dường như không tạo ra bất kỳ sự khác biệt nào (trực quan), ít nhất là trên Android 4.4.2 / KitKit (trên LG / Google Nexus 4).
setTag(1)
trên textView ở vị trí 0, sau đó được sử dụng convertView.getTag() != null
để xác định xem chế độ xem được sử dụng lại là chế độ xem chiều cao 0 được tạo cho vị trí 0 hay chế độ xem bình thường được sử dụng cho các mục spinner khác. Điều này để super.getDropDownView(position, convertView, parent)
đôi khi tôi có thể sử dụng thay vì luôn tạo một chế độ xem mới.