2013-08-08 24 views
5

मैं एक ListView कस्टम एक्सएमएल ListItems साथ आबादी, इस एक्सएमएल है हाइलाइट नहीं करता है:एंड्रॉयड ListView जब एक OnClickListener सेट कर दिया जाता

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="?android:attr/listPreferredItemHeight" 
       android:padding="6dip"> 
... 
</RelativeLayout> 

ListView स्क्रीन पर सही ढंग से पता चलता है और अगर मैं क्लिक करें या एक आइटम पर पकड़

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
... 
} 
: यह नीला हो जाता है

समस्या आता है जब मैं अपने गतिविधि कि BaseAdapter फैली में, देखने के लिए एक OnClickListener आवंटित करने के लिए कोशिश getView अंदर (मैं Holo लाइट थीम उपयोग कर रहा हूँ)

ऐसा करने के बाद, सूची आइटम हाइलाइट रंग अब और नहीं दिखाया गया है, जब मैं किसी सूची आइटम पर क्लिक या होल्ड करता हूं तो इसकी पृष्ठभूमि सफेद रहती है, वैसे भी ऑनक्लिकलिस्टर पूरी तरह से काम कर रहा है।

क्या आपके पास होलोलाइट की डिफ़ॉल्ट शैलियों को रखते हुए हाइलाइट रंग प्राप्त करने के लिए कोई सुझाव है?

उत्तर

3

आप आइटम दृश्यों के लिए अलग-अलग क्लिक श्रोताओं के बजाय पर OnItemClickListener का उपयोग करना चाह सकते हैं।

इसके अलावा, मुख्य आकर्षण समस्या पहले से ही यहाँ वर्णित किया गया है: Android listview no longer highlights selection onclick

+0

जो व्यक्ति डाउनवॉट किया गया, मेरे उत्तर में क्या गलत है, इस पर टिप्पणी करने की परवाह है? इस तरह हम सच्चाई के करीब आ जाएंगे। –

+0

मैंने नहीं किया, वैसे भी मैं OnItemClickListener के बारे में उत्सुक था, क्या आपको लगता है कि यह मेरी समस्या का समाधान करेगा? OnClickListener को अलग करते हुए कोई प्रदर्शन समस्या है? - मैंने पहले से ही उस प्रश्न को पढ़ा है, लेकिन समाधान होलोलाइट शैली का उपयोग नहीं कर रहा है, जिसकी मुझे आवश्यकता है। –

+0

ठीक है, यदि आपके आइटम एक जैसे हैं, तो आप एक श्रोता का उपयोग कर सकते हैं और आइटम आईडी द्वारा अलग-अलग कर सकते हैं - संभवतः सैकड़ों की बजाय एक ऑब्जेक्ट। होलो के लिए - आप उस उत्तर से समाधान के साथ होलो का उपयोग कर सकते हैं, हाइलाइटिंग पृष्ठभूमि का उपयोग करें R.drawable.list_selector_holo_dark –

0

लेआउट को यह जोड़े माता पिता RelativeLayout के लिए जिम्मेदार बताते हैं:

android:addStatesFromChildren="true" 

वैकल्पिक रूप से, कोड कॉल में:

convertView.setAddStatesFromChildren(true); 

किसी भी मामले में, सुनिश्चित करें कि बच्चे के लेआउट में android:duplicateParentState विशेषता सेट नहीं है (और setDuplicateParentState(true) पर कॉल न करें), ओ आप रन टाइम पर अपवाद प्राप्त करेंगे।

+0

यह नहीं है मेरे लिए काम कर रहा है, एक्सएमएल भाग। प्रोग्रामेटिक भाग मैं परीक्षण नहीं कर सकता क्योंकि संकलक विधि सेट के बारे में शिकायत करता है AddStatesFromChildren "मौजूद नहीं है"। वैसे भी, यह क्यों काम करना चाहिए? –

0

आप हाइलाइटिंग व्यवहार को बनाए रखने और कई OnClickListener, यदि आप

  1. OnClickListener
  2. : अक्षम OnClickListener
  3. कॉल OnClickListener एक OnItemClickListener से हो सकता है।

ऐसा करने के लिए, अपने कोड setClickable(false) जोड़ें: प्रोग्राम के रूप में

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
    // make non-clickable again, like before setting the OnClickListener 
    convertView.setClickable(false); 
    ... 
} 

और फोन श्रोता, जैसे: callOnClick() की

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
{ 
    final View view = inflater.inflate(R.layout.fragment_with_listview, container, false); 
    final ListView your_listview = (ListView) view.findViewById(R.id.your_listview); 
    // delegate to specific callbacks 
    your_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { view.callOnClick(); 
     } 
    }); 
    ... 
} 

नोट प्रलेखित व्यवहार:

सीधे किसी भी संलग्न OnClickListener को कॉल करें। performClick() के विपरीत, यह केवल श्रोता को कॉल करता है, और किसी भी क्लिक करने योग्य क्रियाएं नहीं करता है जैसे पहुंच-योग्यता ईवेंट की रिपोर्ट करना।

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