17

में मैं अपने ऐप्लिकेशन में निम्नलिखित संरचना है। ListView में प्रत्येक तत्व में LinearLayout दो TextViews और Button है। LinearLayout और बटन में onClickListeners (अलग) है। LinearLayout पर क्लिक करने से Activity शुरू होता है। मैंने देखा कि क्लिक व्यवहार बहुत असंगत है: कभी-कभी कार्रवाई तुरंत निष्पादित की जाती है लेकिन अक्सर इसमें देरी हो जाती है और कभी-कभी इसे अनदेखा किया जाता है इससे कोई फर्क नहीं पड़ता कि मैं कितनी बार टैप करता हूं। यह भी weirder हो जाता है क्योंकि मैं टैप कर सकता हूं और जब मैं सूची स्क्रॉल करना शुरू करता हूं तो कार्रवाई केवल तभी निष्पादित की जाएगी। मैंने setFocusable(false) और setSelectable(true) के विभिन्न संयोजनों की कोशिश की लेकिन ऐसा कोई फर्क नहीं पड़ता। कोई विचार? मुझे अधिक जानकारी प्रदान करने में खुशी होगी।एंड्रॉयड देरी क्लिक के ListView

उत्तर

3

अगर किसी ने सोचा कि कैसे मैंने इसे हल किया है। असल में मुझे अपने लेआउट को सरल बनाना था। ऐसा लगता है कि जब आपके पास जटिल नेस्टेड संरचनाएं होती हैं तो घटनाएं बबल के लिए बहुत अधिक समय ले सकती हैं और यदि आप एक ही समय में स्क्रॉलिंग सूची शुरू करते हैं तो ईवेंट गलत कार्रवाई को ट्रिगर कर सकता है। मैंने जितना संभव हो सके रिलेवेटिवआउट पर स्विच करके लेआउट को छंटनी की और यह बहुत मददगार लग रहा था

-1

ऐसा लगता है कि आप ईवेंट थ्रेड में कुछ अवरुद्ध प्रक्रिया (जैसे वेबसाइसेस या ओपनिंग फाइलों का आह्वान करना) निष्पादित कर रहे हैं, इसलिए आपका इवेंट थ्रेड अवरुद्ध है। यदि ऐसा है, तो कृपया इवेंट थ्रेड की तुलना में अपने अवरुद्ध कोड को किसी अन्य थ्रेड में संसाधित करें।

+0

मैं लोडर विशेष रूप से AsyncLoader का उपयोग अपने सभी पृष्ठभूमि प्रक्रियाओं क्या करना है। लेकिन मैं कोड का पुनर्मूल्यांकन करूंगा, टिप के लिए धन्यवाद! – Bostone

+0

सभी के बाद कारण नहीं था। मैं हमेशा अपने कोड में हैंडलर पैटर्न का उपयोग जब सूचियों मेरे लिए – Bostone

4

मैं एक ही समस्या में भाग गया, लेकिन मेरे मामले में समाधान दृश्यों के संदर्भों को नहीं रखना था, जिससे ListView के दृश्य में समस्याएं आईं कैशिंग। ConverView के उपयोग के साथ getView() विधि को सही ढंग से कार्यान्वित करने के बाद, खोए/अप्रत्याशित क्लिक कॉल के साथ सभी अजीब व्यवहार समाप्त हो गए थे।

+0

देखें। मैं अपने विचारों में से एक का संदर्भ रख रहा था (जिसका उपयोग तब भी 'लिस्ट व्यू' पंक्ति के लिए किया जाता था) जिन कारणों से मैं यहां नहीं जाऊंगा - इस कारण से किसी भी कारण से उस आइटम पर सभी क्लिकों में देरी का असर पड़ा जब तक कि गतिविधि * * फिर से शुरू किया गया ** जहां वे सभी प्रवाह के माध्यम से बहेंगे और अपवाद का भार पैदा करेंगे। एडाप्टर के अंदर दृश्य बनाने से इस समस्या को हल किया जाता है - बहुत अजीब – Bostone

+0

+1 काम करता है के साथ काम कर मेरा उत्तर – Dori

1

मुझे बजाय व्यक्तिगत सूची आइटम के लिए एक OnClickListener से setOnItemClickListener के माध्यम से ListView के लिए एक OnItemClickListener बताए था के लिए, क्या काम किया। जाहिर है बटन को अभी भी अपने OnClickListener की आवश्यकता है, लेकिन मैंने उस परिदृश्य का परीक्षण नहीं किया है।

9

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

जब मैंने कार्यान्वयन को बदल दिया ताकि मैं दृश्यों का पुन: उपयोग कर सकूं ऑनक्लिक लिस्टनर ने सही तरीके से काम करना बंद कर दिया। 4.4.2 पर अधिकांश क्लिक काम करते थे लेकिन कभी-कभी सूची में स्क्रॉल होने तक कोई प्रतिक्रिया नहीं होती थी। 2.3 पर पहले क्लिक काम नहीं करेंगे और फिर सभी क्लिक जहां एक विस्फोट में संभाला जाएगा।

मेरे विशेष मामले में मैंने जावा कोड में सभी दृश्य बनाए और न कि संसाधनों को बढ़ाकर। और महत्वपूर्ण बिंदु यह था कि जब मैंने दृश्य का पुन: उपयोग किया था तब भी मैंने LinearLayout के लेआउट पैराम सेट किए थे (यह अधिक सुरक्षित प्रतीत होता है, फिर यह मानते हुए कि पुन: उपयोग किए गए दृश्य में सही लेआउट पैरामीटर हैं)। जब मैं लेआउट पैराम सेट नहीं करता हूं तो सब कुछ ठीक करने पर ठीक काम करता है!

public View getView(int position, View convertView, ViewGroup parent) { 
    LinearLayout tapeLine = null; 
    if (convertView != null && convertView instanceof LinearLayout && ((LinearLayout)convertView).getChildCount() == 4) tapeLine = (LinearLayout) convertView; // Reuse view 
    else tapeLine = new LinearLayout(activity); 
    if (convertView == null) { // Don't set LayoutParams when reusing view 
     ViewGroup.LayoutParams tapeLineLayoutParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     tapeLine.setLayoutParams(tapeLineLayoutParams); 
    } 
    ScrollingTape scrollingTape = calculatorHolder.getCalculator().getScrollingTape(); 
    int tapeWidthPx = parent.getWidth(); 
    TapeLineTextSizeInfo tapeLineTextSizeInfo = calculatorHolder.getTapeLineTextSizeHelper().createTapeLineTextSizeInfo(tapeWidthPx); 
    ScrollingTapeLine line = scrollingTape.getLine(position); 
    tapeLine.setOrientation(LinearLayout.HORIZONTAL); 
    int tapeBackgroundColor = getBackgroundColor(line); 
    tapeLine.setBackgroundColor(tapeBackgroundColor); 
    addColumnViews(tapeLine, line, tapeLineTextSizeInfo); 
    tapeLine.setTag(R.id.scrollingtapeadapter_viewtag_position, position); 
    tapeLine.setOnLongClickListener(longClickListener); 
    tapeLine.setOnClickListener(remainClickListener); 
    return tapeLine; 
} 

सूची देखने के इस अजीब व्यवहार के लिए पृष्ठभूमि क्या है: यहाँ महत्वपूर्ण कोड है? मैंने एंड्रॉइड स्रोतों में कुछ डिबगिंग और शोध किया था। जब एंड्रॉइड एक दृश्य को अद्यतन करता है तो माप और ऑनआउट पर दो महत्वपूर्ण कदम होते हैं। ListAdapter की getView विधि न केवल दृश्य को आकर्षित करने के लिए बुलाया जाता है बल्कि पहले भी मेजर के दौरान। इस बाद के मामले में दृश्य बनाया गया है लेकिन क्लिक घटनाओं को संभालने के लिए अभी तक ईवेंट श्रृंखला में पंजीकृत नहीं है।

जब एक दृश्य जो onMeasure के लिए बनाया गया है बाद में पुन: उपयोग किया जाता है acutally स्क्रीन के लिए तैयार किया जाना है, यह एंड्रॉयड सिस्टम से रजिस्टर घटनाओं क्लिक संभालने के लिए किया जाना चाहिए। इस विशेष मामले के लिए एंड्रॉइड डेवेलर्स ने कुछ किया था, जिसे एक गंदे हैक के रूप में माना जा सकता है। लेआउटपैम्स में एक विशेष झंडा का उपयोग यह तय करने के लिए किया जाता है कि दृश्य परिवर्तन में दृश्य को पंजीकृत किया जाना है।

अब मेरी समस्या: LayoutParams भी जब एक दृश्य के पुन: उपयोग किया जाता है रीसेट करके, इस ध्वज हमेशा रीसेट किया गया था। इसलिए एंड्रॉइड सिस्टम दृश्य पंजीकृत नहीं करेगा और घटनाएं नहीं आतीं।

संक्षेप में प्रस्तुत करने: जब एक दृश्य के resusing एक ListAdapter की getView में LayoutParams के ऊपर लिख नहीं है क्योंकि वे एंड्रॉयड सिस्टम की आंतरिक जानकारी रखने के लिए।

+0

मुझे एक ही समस्या थी। मेरे मामले में लेआउट को सूची के डेटा स्रोत के आधार पर आकार बदलना पड़ा था, इसलिए पहली बार दृश्य बढ़ने के बाद मैंने अपना लेआउट किया। स्पेम्स वहां बदल गए और पंक्तियों के आइटम पर क्लिक एक बार फिर ठीक काम किया। –

+0

ओएम * जी, कोई रास्ता नहीं, यह मेरे लिए था! यह पीछे की तरफ, अस्पष्ट और दिमागी मस्तिष्क-मृत है। एक एपीआई एक अनुबंध है और इसका पालन नहीं किया जाता है। मैंने इस पर घंटों खो दिए हैं, उस Google डेवलपर को मेरे पास न जाने दें। मुझे इस पर पागल होने की अनुमति देने के लिए धन्यवाद। –

1

सुनिश्चित नहीं हैं कि अगर यह किसी को भी मदद करता है, लेकिन मैं एक TableLayout साथ बजाय एक ऐसी ही समस्या थी। उपरोक्त समाधानों ने मेरी समस्या को ठीक नहीं किया है।

मेरे लिए समस्या थी: android:animateLayoutChanges="true"

यह मेरा TableLayout पंक्तियों के भीतर मेरा बटन क्लिक ठीक से काम करने की अनुमति दी निकाला जा रहा है। मुझे उपरोक्त संपत्ति पर भरोसा करने के बजाय मैन्युअल रूप से मेरे विचारों को एनिमेट करना पड़ा।

+0

एनीमेशन अक्षम करने के लिए भी मेरे लिए काम किया। –

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