2011-01-10 7 views
45

मेरे लेआउट में एक एंड्रॉइड स्पिनर दृश्य है। मैं चाहता हूं कि उस स्पिनर को बंद होने पर केवल एक ही टेक्स्ट आइटम दिखाना पड़े, लेकिन जब उपयोगकर्ता उस पर क्लिक करता है (यानी स्पिनर संवाद खुलता है) मैं प्रत्येक आइटम के लिए अधिक विस्तृत जानकारी दिखाना चाहता हूं, जिसमें एक आइकन और अतिरिक्त विवरण टेक्स्ट व्यू शामिल है । चूंकि अब यह स्पिनर दोनों राज्यों में एक ही लेआउट (आइकन, शीर्षक + विवरण) दिखाता है।एंड्रॉइड स्पिनर "ड्रॉप डाउन स्टेटस" और "बंद राज्य" के लिए अलग-अलग लेआउट के साथ?

यदि मैं स्पिनर में ऐरे एडाप्टर संलग्न करता हूं, तो मुझे "सेटड्रॉपडाउन व्यू रिसोर्स" नामक किसी चीज़ तक पहुंच प्राप्त होती है, लेकिन यह आवश्यक नहीं है कि मुझे क्या चाहिए, क्योंकि मेरे स्पिनर डेटा को कर्सर से किसी भी प्रकार के ऐरे से नहीं लिया जाता है (मेरे पास है , अभी तक, बेस एडाप्टर को विस्तारित करने के लिए, अपना खुद का एडाप्टर बनाया है)।

कोई भी जो मेरी मदद कर सकता है?

+1

कृपया मेरा जवाब http://stackoverflow.com/questions/4880413/text-color-of-a-closed-spinner/34264463#34264463 –

+0

http://stackoverflow.com/questions/4880413/text- रंग-की-एक-आप बंद हो स्पिनर/34264463 # 34264463 –

उत्तर

83

आप स्पिनर के लिए एक कस्टम Adapter वर्ग बना सकते हैं और सूची दृश्य ड्रॉप डाउन के लिए दो विधियों सामान्य बंद दृश्य के लिए getView() और getDropDownView() ओवरराइट करना। दोनों विधियों को एक तत्व के लिए View ऑब्जेक्ट वापस करना होगा।

this tutorial पर एक नज़र डालें, यह आपको आरंभ करने में मदद कर सकता है।

+0

महान टिप, कि वास्तव में क्या मैं :-) – dbm

+0

लिए देख रहा था मुझे थोड़ी देर के लिया यह पता लगाने के लिए है, लेकिन मैं वास्तव में क्या देख रहा था के लिए अंक! – Rabbott

+0

ग्रेट टिप, यह वही था जो मैं ढूंढ रहा था! ओह मेरा गुड: ओ बहुत धन्यवाद – TiagoM

7

मुझे भी समस्या हो रही थी। कक्षा को ओवरराइड करने की बजाय, मैं ऐसा करने का एक आसान तरीका है।

लेकिन पहले आपको एडाप्टर कन्स्ट्रक्टर में संसाधन आईडी के बीच अंतर और दूसरे को setDropDownViewResource में अंतर को समझने की आवश्यकता है। उदाहरण के लिए,

SimpleAdapter adapter = 
    new SimpleAdapter(ab.getThemedContext(), data, R.layout.actionbar_dropdown, new String[] { "EventID", "Icon" }, 
     new int[] { R.id.event_id, R.id.icon }); 

adapter.setDropDownViewResource(R.layout.actionbar_list_item); 

R.layout.actionbar_dropdown हर एक सूची आइटम के लिए स्पिनर के लिए शैली में है और R.layout.actionbar_list_item। मैंने सरल एडाप्टर का उपयोग यहां किया, क्योंकि अगर मैं ऐरेएडाप्टर का उपयोग करता हूं, तो एक्सएमएल केवल एक टेक्स्ट व्यू हो सकता है। R.layout.actionbar_list_item में एक टेक्स्ट व्यू है जिसका आईडी event_id है और एक ImageView जिसका आईडी आइकन है। R.layout.actionbar_dropdown लगभग actionbar_list_item जैसा ही है। लेकिन उत्तरार्द्ध के ImageView की दृश्यता को जाने के लिए सेट है।

इस तरह प्रत्येक सूची आइटम में एक टेक्स्टव्यू और एक छविदृश्य होता है, लेकिन आप केवल स्पिनर पर एक टेक्स्टव्यू देखेंगे।

+0

यह वास्तव में सही जवाब होना चाहिए क्योंकि फ़्लो द्वारा एक से अधिक कार्यान्वित करना कहीं अधिक आसान है (वह समाधान भी काम करता है और कुछ मामलों में इसकी आवश्यकता हो सकती है, केवल ओपी के प्रश्न के लिए सख्ती से जरूरी नहीं है ।) – Kevin

+0

उत्कृष्ट - एक सिफारिश है! – RMcGuigan

5

फ्लो द्वारा लिखे गए ट्यूटोरियल के कोड का उपयोग करके, मैंने स्ट्रिंग्स के दो अलग-अलग सेट दिखाने के लिए निम्न आइटमस्पिनर एडाप्टर बनाया, जब आइटम प्रदर्शित होते हैं, और एक नहीं। मुझे उम्मीद है कि यह किसी की मदद करेगा।

public class CustomSpinnerAdapter extends ArrayAdapter<String> { 

Context mContext; 
int mTextViewResourceId; 
String[] mObjects; 
String[] mShortNameObjects; 

public CustomSpinnerAdapter(Context context, int textViewResourceId, 
          String[] objects, String[] shortNameObjects) { 
    super(context, textViewResourceId, objects); 
    mContext = context; 
    mTextViewResourceId = textViewResourceId; 
    mObjects = objects; 
    mShortNameObjects = shortNameObjects; 
} 

@Override 
public View getDropDownView(int position, View convertView, 
          ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false); 
    row.setText(mObjects[position]); 

    return row; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    return getCustomView(position, convertView, parent); 
} 

public View getCustomView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false); 
    row.setText(mShortNameObjects[position]); 

    return row; 
} 
} 

और उपयोग एक टुकड़ा अंदर:

CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names)); 

अंत में, स्पिनर आइटम के लिए लेआउट:

spinner_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18dip" 
    android:gravity="left" 
    android:textColor="@color/navdraw_list_item_background_default" 
    android:padding="5dip" /> 
+0

आपको अपने 'getView()' और 'getDropDownView()' विधियों में 'कन्वर्ट व्यू' पैरामीटर का उपयोग करना चाहिए। – Gus

+0

अच्छा और स्पष्ट। –

3

केवल लटकती सेट अपने वैकल्पिक लेआउट के साथ संसाधन देखें:

ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER); 
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown); 
view.setAdapter(genderAdapter); 

मेरे लिए, यह है, केवल एक अतिरिक्त गद्दी छोड़ के साथ एक लेआउट है, क्योंकि स्पिनर की मेरी पृष्ठभूमि एक गोल drawable है और इस अतिरिक्त स्थान की आवश्यकता होती है।

संबंधित मुद्दे