मैं एंड्रॉइड स्पिनर विजेट में एक आइटम को छिपाने का तरीका ढूंढ रहा हूं। यह आपको किसी स्पिनर को चुने हुए आइटम के साथ अनुकरण करने की अनुमति देगा, और यह सुनिश्चित करता है कि onItemSelected () कॉलबैक को हमेशा चुने गए प्रत्येक आइटम के लिए कहा जाता है (यदि छिपा आइटम "वर्तमान" एक है)। आम तौर पर स्पिनर में हमेशा एक आइटम होता है जो कॉलबैक उत्पन्न नहीं करता है, अर्थात् वर्तमान एक।
कैसे (ग्रे आउट) आइटमों को अक्षम करने के लिए स्टैकओवरफ़्लो पर कुछ कोड है, लेकिन आइटम को पूरी तरह से छिपाने के लिए कैसे नहीं जैसे कि वे मौजूद नहीं हैं।
बहुत प्रयोग के बाद मैं कुछ हद तक हैक-ईश समाधान के साथ आया हूं जो विभिन्न पुराने और नए एंड्रॉइड प्लेटफार्मों पर काम करता है। इसमें कुछ मामूली कॉस्मेटिक कमियां हैं जिन्हें नोटिस करना मुश्किल है। मैं अभी भी एक अधिक आधिकारिक समाधान के बारे में सुनना चाहूंगा, "स्पिनर के साथ ऐसा न करें" के अलावा।
यह हमेशा स्पिनर में पहला आइटम छिपाता है, लेकिन एक आइटम या एक से अधिक आइटम को छिपाने के लिए काफी आसानी से बढ़ाया जा सकता है। स्पिनर आइटम की अपनी सूची की शुरुआत में एक खाली स्ट्रिंग युक्त डमी आइटम जोड़ें। स्पिनर संवाद खुलने से पहले आप वर्तमान स्पिनर चयन को आइटम 0 पर सेट करना चाह सकते हैं, यह एक अचयनित स्पिनर को अनुकरण करेगा।
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);
लाइन अनावश्यक है। यह टिप्पणी करते हुए कम से कम Android 4.4.2 / KitKit (LG / Google Nexus 4 पर) पर कोई (दृश्य) अंतर नहीं लगता है।
setTag(1)
स्थिति 0 पर textView पर उपयोग किया है, फिर convertView.getTag() != null
यह निर्धारित करने के लिए उपयोग किया जाता है कि पुन: उपयोग किया गया दृश्य स्थिति 0 के लिए बनाया गया 0 ऊंचाई दृश्य या अन्य स्पिनर आइटम के लिए उपयोग किया जाने वाला सामान्य दृश्य है। ऐसा था इसलिए मैं super.getDropDownView(position, convertView, parent)
हमेशा एक नया दृश्य बनाने के बजाय कभी-कभी उपयोग कर सकता था ।