2010-02-02 11 views
19

पर सूची आइटम को अक्षम कैसे करें मैं एंड्रॉइड देव के लिए काफी नया हूं और अभी भी बहुत सी चीजें काम कर रहा हूं।एंड्रॉइड: सूची निर्माण

मेरे पास निम्न कोड का उपयोग करके एक मुख्य मेनू दिखाया गया है, लेकिन मेनू में चयनित आइटम को अक्षम करने का तरीका नहीं बता सकता है। क्या कोई मुझे कुछ नमूना कोड के साथ मदद कर सकता है?

public class listTest extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedState) { 
     super.onCreate(savedState); 
     setListAdapter(ArrayAdapter.createFromResource(this, R.array.mainMenu, 
       android.R.layout.simple_list_item_1)); 
     //not sure how to disable list items here 
    } 

    protected void onListItemClick(ListView list, View view, int position, long id) { 
     // can disable items when they are clicked on 
     view.setEnabled(false); 
    } 

} 

और मैं अपने strings.xml फ़ाइल में एक string-array है:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="mainMenu"> 
     <item>Item 1</item> 
     <item>Item 2</item> 
     <item>Item 3</item> 
    </string-array> 
</resources> 

धन्यवाद

+0

त्वरित स्पष्टीकरण के युगल: यदि आप मेनू चाहते हैं, तो जब उपयोगकर्ता मेनू कुंजी दबाता है तो पॉप अप होता है, फिर अपनी 'गतिविधि' में' onCreateOptionsMenu' विधि देखें। इसके अलावा, आपको उस तरह के आवेदन संदर्भ पर पकड़ने की आवश्यकता नहीं है; एक 'गतिविधि' पहले से ही' संदर्भ 'बढ़ाता है (जैसा कि आप अपने कॉल में' createFromResource (यह, ...) ' –

+0

पर देख सकते हैं, मैं एक मुख्य मेनू चाहता हूं जो एप्लिकेशन को पहली बार खोले जाने पर दिखाएगा, इसलिए विकल्पमेनू और संदर्भमेनू किसी भी अच्छे नहीं हैं मैं सूची दिखाने मिल गया है और आइटम निष्क्रिय कर सकते हैं, जब वे पर क्लिक किया गया है:। \t संरक्षित शून्य onListItemClick (ListView सूची, देखें देखने के लिए, पूर्णांक स्थिति, लंबे आईडी) { \t \t दृश्य। setEnabled (गलत);।। } \t लेकिन मैं कैसे onCreate में विकलांग के लिए एक चयनित सूची आइटम स्थापित करने के लिए कोई जानकारी नहीं है आवेदन संदर्भ पर प्रसिद्घ - धन्यवाद – Martyn

उत्तर

43

सूची निर्माण पर सूची आइटम को अक्षम करने के लिए आपको ArrayAdapter से उप-वर्ग होना होगा। आपको निम्न विधियों को ओवरराइड करना होगा: isEnabled(int position) और areAllItemsEnabled()। पूर्व में आप true या false पर वापस दिए गए स्थान पर सूची आइटम सक्षम करते हैं या नहीं। बाद में आप false लौटते हैं।

यदि आप createFromResource() का उपयोग करना चाहते हैं तो आपको उस विधि को भी लागू करना होगा, क्योंकि ArrayAdapter.createFromResource() अभी भी आपके अपने एडाप्टर के बजाय ArrayAdapter को तुरंत चालू करता है।

अंत में, कोड निम्नलिखित कुछ ऐसा दिखाई देगा:

class MenuAdapter extends ArrayAdapter<CharSequence> { 

    public MenuAdapter(
      Context context, int textViewResId, CharSequence[] strings) { 
     super(context, textViewResId, strings); 
    } 

    public static MenuAdapter createFromResource(
      Context context, int textArrayResId, int textViewResId) { 

     Resources  resources = context.getResources(); 
     CharSequence[] strings = resources.getTextArray(textArrayResId); 

     return new MenuAdapter(context, textViewResId, strings); 
    } 

    public boolean areAllItemsEnabled() { 
     return false; 
    } 

    public boolean isEnabled(int position) { 
     // return false if position == position you want to disable 
    } 
} 
+15

इस समाधान से सावधान रहें। बेसएडाप्टर का प्रलेखन निम्न में बताता है "यदि निर्दिष्ट स्थिति पर आइटम विभाजक नहीं है तो सत्य लौटाता है।" इसका मतलब है कि यदि आप झूठी वापसी करते हैं तो आइटम एक विभाजक वस्तु है। कुछ फोन एंड्रॉइड नहीं खींच सकते हैं: एक सामान्य आइटम और विभाजक आइटम के बीच विभाजक। – Janusz

+0

@ जैनुस हां मुझे विभाजक लाइन के इस मुद्दे का सामना करना पड़ा, क्योंकि जब मैंने कुछ इंडेक्स में आइटम को डिवाइडर लाइन चला दी थी। इसलिए मैंने इंडेक्स पर दृश्य को देखने के लिए थोड़ा भूरा देखा :) –

+0

@AliImran: क्या आप कृपया इस मुद्दे को विभाजित करने वाले विभाजन के साथ इस मुद्दे को प्रबंधित करने के बारे में कुछ और बता सकते हैं? धन्यवाद – dentex

11

मेरा मानना ​​है कि किसी सूची आइटम सक्षम किया गया है या नहीं, है कि आइटम के राज्य का हिस्सा है, इसलिए मुझे लगता है कि आपको इसे अपने ListAdapter में प्रबंधित करना होगा। एडाप्टर को उपclassing करते समय, आप isEnabled(position) ओवरराइड कर सकते हैं। किसी भी स्थिति के लिए आप यहां वापस आते हैं, ListView इस आइटम को अक्षम के रूप में चिह्नित करेगा।

class MenuAdapter extends ArrayAdapter<String> { 

    public boolean isEnabled(int position) { 
     // return false if position == positionYouWantToDisable 
    } 

} 

यह शायद उदा की आवश्यकता है:

तो क्या आप क्या करना चाहते कुछ इस तरह है एक Map प्रत्येक आइटम की सक्षम स्थिति का प्रबंधन यदि आप एक सेटटर का उपयोग कर किसी आइटम को सक्षम/अक्षम करने में सक्षम होना चाहते हैं।

फिर अपनी सूची दृश्य पर कस्टम एडाप्टर सेट करें।

+0

अपने उत्तर के लिए धन्यवाद, यह अच्छा लग रहा है लेकिन इसे लागू करने में समस्याएं हैं। setListAdapter (MenuAdapter.createFromResource (यह, R.array.mainMenu, android.R.layout.simple_list_item_1)); मेनू एडाप्टर मुख्यमेनूलिस्ट = (मेनू एडाप्टर) getListAdapter(); mainMenuList.isEnabled (2); // बस झूठी एटीएम लौटने के लिए सेट करें कोई विचार जहां मैं गलत जा रहा हूं? यह वर्तमान में – Martyn

+0

दुर्घटनाग्रस्त है ठीक है, आप क्या अपवाद प्राप्त कर रहे हैं? – Matthias

+0

02-03 13: 51: 21.971: ERROR/AndroidRuntime (1365): java.lang.RuntimeException: गतिविधि प्रारंभ करने में असमर्थ ComponentInfo {com.martyn.test/com.martyn.test.test}: java.lang.ClassCastException: android.widget.ArrayAdapter – Martyn

6

आप किसी सूची आइटम निष्क्रिय कर सकते हैं (= यह छूता का जवाब नहीं देते हैं) दोनों

setClickable(false) 

और

फोन करके
setFocusable(false) 

उदाहरण के लिए, आपके एडाप्टर में।

डिफ़ॉल्ट रूप से, यह स्वचालित रूप से ग्राफिकल रूप से प्रतिबिंबित नहीं होता है, हालांकि।

मैं वर्तमान में उस सूची में उपयोग कर रहा हूं जिसकी सूची आइटम क्लिक करने योग्य नहीं है लेकिन इनमें से अधिकतर क्लिक करने योग्य विजेट हैं। अच्छा काम करता है।

इस प्रकार, सूची आइटम सामान्य रूप से विभाजक सहित खींचे जाते हैं (उपरोक्त स्वीकृत उत्तर के लिए जनसज़ का उत्तर देखें)।

+0

क्या आप अधिक विशिष्ट हो सकते हैं? एडाप्टर में आप इसे कहां कहते हैं? आपका उत्तर बहुत ही आशाजनक प्रतीत होता है, लेकिन मुझे कोई संकेत नहीं है कि इसे कैसे कार्यान्वित किया जाए ... – Pooks

+1

मैंने 'बेसएडाप्टर 'का उप-वर्ग लागू किया है जो सूची सेल लेआउट को' getView' विधि में बढ़ाता है। लेआउट एक्सएमएल में, मूल तत्व (मेरे मामले में) एक 'लीनियरलाउट' है जो न तो फोकस करने योग्य है और न ही क्लिक करने योग्य है: 'एंड्रॉइड: फोकस करने योग्य =" झूठा "' और 'एंड्रॉइड: क्लिक करने योग्य =" झूठा "' – Raginmari

+0

आप यह भी कर सकते हैं अपनी सूची आइटम का प्रतिनिधित्व करने वाले दृश्य पर 'setClickable (false)' और 'setFocusable (false)' को कॉल करके अपने एडाप्टर की 'getView' विधि में कोड में कोड में। – Raginmari

-3

या पर पंजीकरण और पंजीकरण करने के सरल तरीके से OnItemClickListener एक बेहतर विचार हो सकता है।

रजिस्टर करने के लिए:

lstDevice.setOnItemClickListener (संदर्भ);

डी-रजिस्टर करने के लिए:

lstDevice.setOnItemClickListener (शून्य);

+0

आपको teh प्रश्न नहीं समझा .. – Siddharth

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