RecyclerView क्रैश हो जाता है, जब "स्क्रैप या संलग्न दृश्य पुनर्नवीनीकरण नहीं हो सकते हैं"


114

मैं RecyclerViewएंड्रॉइड वेबसाइट से लिए गए सरल कार्यान्वयन का उपयोग कर रहा हूं StaggeredGridLayoutManagerऔर मैं इस त्रुटि को प्राप्त कर रहा हूं जो मेरे ऐप को क्रैश कर रहा है:

java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
            at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:3501)
            at android.support.v7.widget.RecyclerView$LayoutManager.scrapOrRecycleView(RecyclerView.java:5355)
            at android.support.v7.widget.RecyclerView$LayoutManager.detachAndScrapAttachedViews(RecyclerView.java:5340)
            at android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:572)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1918)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2155)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
            at android.view.Choreographer.doCallbacks(Choreographer.java:562)
            at android.view.Choreographer.doFrame(Choreographer.java:532)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)  

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

किसी और को यह त्रुटि हो रही है और पता है कि इससे कैसे निपटना है?


आपको कोई हल मिला?
प्रतीक बुटानी

जवाबों:


191

यह त्रुटि तब होती है यदि आपके XML में आपने android:animateLayoutChangesसही सेट किया है और आप notifyDataSetChanged()जावा कोड में RecyclerView के एडेप्टर पर कॉल करते हैं।

तो, बस android:animateLayoutChangesRecyclerViews के साथ उपयोग करने से बचें ।


22
तो फिर कैसे एक recyclerview में animateLayoutChanges सुविधा का उपयोग कर सकते हैं?
dhuma1981

आप क्या हासिल करने का प्रयास कर रहे हैं? आइटम एनीमेशन? यदि हां, तो RecyclerView API इसका समर्थन करता है - प्रलेखन पर एक नज़र डालें: developer.android.com/reference/android/support/v7/widget/…
केनेथ

4
@ dhuma1981 यदि आइटम एनिमेटर mRecyclerView.setItemAnimator (नया DefaultItemAnimator ()) के माध्यम से सेट किया गया है; तब चेतनआउटआउट्स को सच होने की आवश्यकता नहीं है
रिच एहमर

RecyclerViewDefaultItemAnimatorडिफ़ॉल्ट रूप से उपयोग करता है।
बेंजामिन

-, - मुझे यह समस्या है कि कैसे यू ने इसका वर्णन किया
निंजा कोडिंग

52

मुझे इस दुर्घटना से भी जूझना पड़ा है और मेरे मामले में इसका कोई लेना देना नहीं था android:animateLayoutChanges

RecyclerViewहमें इमारत नहीं थी यह और कुछ में देखे जाने की तुलना में अधिक एक प्रकार कर रहे थे EditTextउन में रों। थोड़ी देर के बाद हमने संबंधित मुद्दे पर ध्यान केंद्रित किया। यह बग EditTextएस रिसाइकिल करते समय होता है और उनमें से एक पर ध्यान केंद्रित किया जाता है।

स्वाभाविक रूप से हमने फोकस को साफ़ करने की कोशिश की जब नए डेटा को एक पुनर्नवीनीकरण दृश्य के लिए बाध्य किया जा रहा है, लेकिन यह तब तक काम नहीं करता जब तक android:focusableInTouchMode="true"सेट नहीं किया जाता है RecycleView। वास्तव में यह एकमात्र बदलाव है जो इस मुद्दे को दूर करने के लिए अंत में आवश्यक था।


2
एक पुनर्नवीनीकरण दृश्य में EditTexts का उपयोग करते समय मेरे पास कई फ़ोकस संबंधित हल किए गए शानदार, हल किए गए। धन्यवाद!
Rabie Jradi

1
मैं recyclerview में एसीईटी था, और यह क्रश करता है। इस पोस्ट ने मुझे बचाया।
काई वांग

और मैं आइटम में edittexts नहीं है, मैं हालांकि checkboxes है। क्या मुझे कोशिश करनी चाहिए android:focusableInTouchMode="true"क्योंकि यह कभी-कभी केवल कुछ उपकरणों (शायद ही कभी) में होता है और मुझे लगता है कि यह मेरी समस्या से संबंधित नहीं है, लेकिन क्रैश के लिए स्टैक-ट्रेस लगभग समान है।
शिवंश

यह मेरा मामला था, लेकिन सेटिंग android:focusableInTouchMode="true"करने से मुझे बिल्कुल मदद नहीं मिली। इसलिए मैंने onViewDetachedFromWindowकॉलबैक में ध्यान केंद्रित किया । public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) { if (holder instanceof ItemViewHolder) { ItemViewHolder item = (ItemViewHolder) holder; if (item.editText.isFocused()) item.editText.clearFocus(); } }
आर्टमैन

24

मैंने android:animateLayoutChangesलेआउट प्रॉपर्टी से हटा दिया और समस्या हल हो गई।


मुझे यह दुर्घटना तब लगी जब मैंने android:animateLayoutChangesअपने आरवी पर भी रखा ।
मौकर

2
यह ध्वज जनक कंटेनर (सापेक्ष लेआउट) पर सेट किया गया था। मुद्दा तय किया।
1911z

@ 1911z यू कह रहे हैं कि आपके पास मूल कंटेनर पर झंडा था और इसे वहां से हटाने से यह मुद्दा तय हो गया?
रामप्रसाद बिस्मिल

14

जिन कारणों से कोई भी इस समस्या का सामना कर सकता है, जांच लें कि क्या आपने android:animateLayoutChanges="true"RecyclerView के लिए विशेषता निर्धारित की है । यह रीसाइक्लिंग और RecyclerView की वस्तुओं को फिर से शुरू करने में विफल कर देगा। इसे निकालें और इस विशेषता को RecyclerView के मूल कंटेनर, जैसे LinearLayout / RelativeLayout में असाइन करें और आपको समस्या को दूर जाते देखना चाहिए।


मैंने इस दुर्घटना को तब भी देखा था जब मैंने आरवी के मूल कंटेनर पर विशेषता निर्धारित की थी।
रामप्रसाद बिस्मिल

@RamPrasadBismil कृपया अपना कोड पोस्ट करें और हो सकता है कि हम इसे देख सकें?
राम अय्यर

12

मुझे दो दिन लग गए लेकिन इसके आसपास नहीं पहुंच पाया, अंत में, मुझे आइटम प्रीफ़ैच को अक्षम करना पड़ा।

लेआउट मैनेजर सेट करते समय आप बस कॉल कर सकते हैं

mGridLayoutManager.setItemPrefetchEnabled(false);

इसने मेरे लिए त्रुटि दूर कर दी। आशा है कि यह किसी के लिए उपयोगी होगा।


मेरे लिए काम किया। धन्यवाद।
विक्की

1
मैं वास्तव में इस समाधान को अपनाने वाले लोगों के बारे में चिंतित हूं। आप इस ध्वज को अक्षम करने में बहुत कुछ खो देते हैं और बग अभी भी दूसरी जगह पर है -
फेलिप कैस्टिलहोस

8

स्लिमफिट चिपचिपा हेडर का उपयोग करते समय मुझे इस त्रुटि का सामना करना पड़ा। यह गलत पहली स्थिति सेट करने के कारण हुआ था। मुझे यहाँ जवाब मिला

public void onBindViewHolder(MainViewHolder holder, int position) {

  final View itemView = holder.itemView;
  final LayoutManager.LayoutParams params = LayoutManager.LayoutParams.from(itemView.getLayoutParams());

  params.setSlm(LinearSLM.ID);
  params.width = ViewGroup.LayoutParams.MATCH_PARENT;
  params.setFirstPosition(item.mSectionFirstPosition);
  itemView.setLayoutParams(params);

}

बस सुनिश्चित करें कि आप mSectionFirstPosition के लिए सही मान पास कर रहे हैं


StackOverflow में आपका स्वागत है। क्या आप कृपया केवल एक लिंक के बजाय एक पूर्ण उत्तर प्रदान कर सकते हैं?
स्लफैन

itemयहाँ क्या है
कीड़े 5

यह सूची आइटम है जिसे पुनर्नवीनीकरण दृश्य में दिखाया जाना है। इसलिए मूल रूप से मैं प्रत्येक सूची आइटम के खिलाफ अनुभाग को पहले स्थान पर बचा रहा हूं।
जसपिंदर कौर

8

मैं आज सुबह इस मुद्दे पर मिला था, लेकिन मैं ऊपर बताए गए कारण का सामना नहीं कर रहा हूं।

वाद-विवाद के बाद मैंने पाया कि मेरे ViewHolder में आइटम दृश्य है mParent और यह अशक्त नहीं है, जो कि सामान्य स्थिति में यह कोई भी नहीं होना चाहिए (जो कि लॉग कह रहा है, "संलग्न दृश्य को पुनर्नवीनीकरण नहीं किया जा सकता है", मुझे लगता है कि इसका मतलब है कि अगर बच्चा देखें यह पहले से ही एक माता-पिता से जुड़ा हुआ है, यह कुछ ऐसा होगा जो पुनरावर्तन के समय विफलता का कारण बनता है।)

लेकिन मैं बच्चे को हर बार हाथ से देखने नहीं देता था। और मैंने पाया कि जब मैंने अपने ViewHolder में बच्चे के दृश्य को बढ़ाने की कोशिश की, तो यह कुछ इस प्रकार है:

layoutInflater.inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

और अंतिम पैरामीटर attachToRootगलत होना चाहिए।

मैं इसे बदलने के बाद false , मैंने अपनी समस्या ठीक कर ली।

वैसे, मुझे केवल यह दुर्घटना दिखाई देती है जब मैं अपनी समर्थन लाइब्रेरी को नवीनतम संस्करण 25.0.0 में अपग्रेड करता हूं। इससे पहले कि मैं 23.4.0 संस्करण का उपयोग कर रहा था और मुझे यह समस्या नहीं दिख रही है। मुझे लगता है कि नवीनतम समर्थन लाइब्रेरी में कुछ बदला जाना चाहिए।

उममीद है कि इससे मदद मिलेगी।


8

जब मैं स्क्रॉल करता RecyclerViewहूं तो मुझे भी इसी तरह की गड़बड़ी का सामना करना पड़ा : फिर मैंने animateLayoutChanges="true"लेआउट फाइल में RecyclerViewउस समय के लिए हटा दिया जब सब कुछ काम कर गया।


6

मेरे मामले में ऐसा इसलिए हुआ क्योंकि TransitionRecyclerView का आकार बदलने की कोशिश करते समय मेरे पास एक रनिंग थी क्योंकि सॉफ्टवेयर कीबोर्ड दिखाने वाला था।

मैंने इसका Transitionउपयोग करके अपने पुनर्नवीकरण दृश्य को छोड़कर इसे ठीक कर दिया Transition.excludeTarget(R.id.recyclerview, true);


6

इस अपवाद को क्यों कहा जाता है इसके कई कारण हैं। मेरे मामले में यह एनिमेशन के कारण था कि दृश्य अभी भी क्यों जुड़े हुए हैं और दृश्य को हटाया नहीं जा सकता। केवल जब एनीमेशन समाप्त हो जाता है, तो इस दृश्य को हटाया और पुनर्नवीनीकरण किया जा सकता है।

दो प्रकार के एनीमेशन हैं जो रिसाइकलव्यू रीसाइक्लिंग को प्रभावित कर सकते हैं।

1) है RecyclerView.ItemAnimator- यह समस्या नहीं होनी चाहिए। यह उपयोग करने के लिए बहुत सुरक्षित होना चाहिए क्योंकि यह संलग्न और स्क्रैप किए गए विचारों की जांच करता है और ठीक से रीसाइक्लिंग को संभालता है।

2) android:animateLayoutChanges="true"या TransitionManager.beginDelayedTransition()ट्रांसिशनमैनेजर.गो (), आदि - ये एनिमेशन अपने आप चलते हैं और वस्तुओं को चेतन तक ले जाते हैं। यह परिणाम एनीमेशन समाप्त होने तक संलग्न होने के लिए मजबूर होने का परिणाम है। Recyclerview को इन एनिमेशन का कोई ज्ञान नहीं है क्योंकि यह इसके दायरे से बाहर है। इसलिए recyclerviewहो सकता है कि यह सोचकर किसी आइटम को रीसायकल करने की कोशिश की जाए लेकिन इसे ठीक से रीसायकल किया जा सकता है, लेकिन समस्या यह है कि ये एपीआई तब भी व्यूज पर टिके रहते हैं जब तक एनिमेशन खत्म नहीं हो जाता।

आप उपयोग कर रहे हैं android:animateLayoutChanges="true"या TransitionManager.beginDelayedTransition()TransitionManager.go (), आदि या बस को दूर RecyclerViewएनीमेशन से और उसके बच्चों को।

आप बस इसे पकड़ कर Transitionकॉल कर सकते हैं

Transition.excludeChildren(yourRecyclerView, true)
Transition.excludeTarget(yourRecyclerView, true)

ध्यान दें:

ध्यान दें कि Transition.excludeChildren()सभी Recyclerviewबच्चों को एनीमेशन से बाहर करने के लिए उपयोग करना महत्वपूर्ण है और न केवल Recyclerviewस्वयं।


धन्यवाद! TransitionManager.beginDelayedTransition () मेरे मामले में समस्या का कारण था। आप अपने कोड उदाहरण का उपयोग करने के तरीके के बारे में अधिक जानकारी के साथ अपडेट कर सकते हैं Transition.excludeChildren। आप किसी संक्रमण ऑब्जेक्ट को जैसे:, इस ऑब्जेक्ट पर val transition = AutoTransition()कॉल excludeChildren(recyclerView, true)करते हैं और इसे पास करते हैं beginDelayedTransaction() as the second parameter
डेनिलो प्राडो

5

मुझे भी यह त्रुटि तब हो रही थी जब मुझे RecyclerView के लिए लेआउट फ़ाइल में चेतनआउट्स = "सत्य" मिला। यह विशेषता हटाएं और त्रुटि गायब हो जाएगी!


कृपया ध्यान दें कि यह प्रश्न 2014 से है और अब तक गुण बदल गए होंगे।
कोरासेन

2
नहीं इसका अभी तक नहीं बदला
संजय कुशवाह

4

हालांकि मेरे मामले में यह animateOnLayoutChangerecyclerView से हटा रहा था जिसने दुर्घटना को ठीक कर दिया था, फिर भी मुझे व्यूहॉर्डर के भीतर लेआउट परिवर्तनों को चेतन करने की क्षमता की आवश्यकता थी। काम करने के लिए इसे प्राप्त करने के लिए, LinearLayout' in the view holder needs the'a trueOnLayoutChange' को सही करें, लेकिन मुझे notifyItemChangedएडॉप्टर की आवश्यकता है। इसके बाद दोनों लेआउटट्रांसमेंट एनिमेशन को किक करने के लिए (व्यूहॉल्डर को विस्तारित करने और ढहाने के लिए) अनुमति दी, और स्क्रैप किए गए अपवाद से भी बचा जाता है। तो हाँ, recylcerView पर aimateOnLayoutChange को डालने से बचें और दृश्य आकार परिवर्तनों पर डिफ़ॉल्ट एनिमेशन सक्षम करने के लिए विभिन्न अधिसूचित विधियों का उपयोग करें।


मैं आइटम के विस्तार को चेतन करने के लिए एक ही काम करने की कोशिश कर रहा हूं, लेकिन एडेप्टर में InformItemChanged को कॉल करने से आइटम फ्लैश के बाद बदल जाता है (एनीमेशन काम करता है)! आप इसे कैसे रोकेंगे?
फ्लाईव्यू

हमारे उपयोग के मामले के लिए, हमने एक विस्तार योग्य-लेआउट का उपयोग करने के लिए, aimateOnLayoutChange का उपयोग करके अपने कस्टम कोड को स्वैप किया। यह उसी चीज को पूरा करता है जैसा कि हम पूरा करने की कोशिश कर रहे थे लेकिन अधिक लचीला तरीका। github.com/chuross/expandable-layout
Kingargyle

3

मैं निकाल कर इस समस्या का समाधान parent.addView()मेंonCreateViewHolder

यह मेरा कोड है

public MyViewHolder onCreateViewwHolder(ViewGroup parent, int viewType)  {
    Button addButton = new Button(context);
    //parent.addView(addButton);
    return new MyViewHolder(addButton);
}

पर समारोह android.support.v7.widget.RecyclerViewRecycler.recyclerViewHolderinternal()की जांच मेरी बटन एक माता पिता पहले से ही किया है या नहीं। यदि हम माता-पिता के लिए बटन जोड़ते हैं, तो यह RecyclerViewइसके mParentचर को भी असाइन किया जाएगा ।


मुझे लगता है कि यह एक नई आवश्यकता है, मैंने माता-पिता को पुस्तकालय के समर्थन के संस्करण 24 में संलग्न किया, एक बार 25 में अपडेट होने के बाद मुझे दुर्घटना हो गई।
किरिल कुलकोव

1

मैंने देखा कि यह मेरे लिए तब हुआ जब मैंने एडॉप्टर के ViewHolderलिए एक कस्टम ऑब्जेक्ट का उपयोग किया RecyclerView

समस्या को ठीक करने के लिए मैंने कस्टम ऑब्जेक्ट को साफ़ किया जो मेरे मामले onViewRecycled(ViewHolder holder)में नीचे दिए गए एडेप्टर के लिए एक टाइमर था :

    public void onViewRecycled(ViewHolder holder) {
        if(holder instanceof  EntityViewHolder) {
            if(((EntityViewHolder)holder).timer != null) {
                ((EntityViewHolder) holder).timer.cancel();
            }
        }
        super.onViewRecycled(holder);
    }

यह बग तय किया।


1
    /**
     * Informs the recycler whether this item can be recycled. Views which are not
     * recyclable will not be reused for other items until setIsRecyclable() is
     * later set to true. Calls to setIsRecyclable() should always be paired (one
     * call to setIsRecyclabe(false) should always be matched with a later call to
     * setIsRecyclable(true)). Pairs of calls may be nested, as the state is internally
     * reference-counted.
     *
     * @param recyclable Whether this item is available to be recycled. Default value
     * is true.
     *
     * @see #isRecyclable()
     */
    public final void setIsRecyclable(boolean recyclable) {
        mIsRecyclableCount = recyclable ? mIsRecyclableCount - 1 : mIsRecyclableCount + 1;
        if (mIsRecyclableCount < 0) {
            mIsRecyclableCount = 0;
            if (DEBUG) {
                throw new RuntimeException("isRecyclable decremented below 0: " +
                        "unmatched pair of setIsRecyable() calls for " + this);
            }
            Log.e(VIEW_LOG_TAG, "isRecyclable decremented below 0: " +
                    "unmatched pair of setIsRecyable() calls for " + this);
        } else if (!recyclable && mIsRecyclableCount == 1) {
            mFlags |= FLAG_NOT_RECYCLABLE;
        } else if (recyclable && mIsRecyclableCount == 0) {
            mFl`enter code here`ags &= ~FLAG_NOT_RECYCLABLE;
        }
        if (DEBUG) {
            Log.d(TAG, "setIsRecyclable val:" + recyclable + ":" + this);
        }
    }

1

1 1 、removeसूची से डेटा हटा दें।

2 notifyDataSetChangedD: सूचनाडॉटसेटचेंज ();

3 3 、notifyItemRemovedशो एनीमेशन।

4 、 、notifyItemRangeChangedरेंज का आकार और फिर से देखेंviewHolders(onBindViewHolder methods)


मैंने notifyItemRemovedहटाते समय footerऔर ऐप क्रैश होने पर, इसे बदल दिया है notifyDataSetChangedऔर अब यह ठीक काम करता है। धन्यवाद
सिआर्ही

1

मेरे मामले में, मैंने TransitionManager.beginDelayedTransition()recyclerView के शीर्ष पर एक दृश्य जोड़ने से पहले उपयोग किया । मैंने हटा दिया TransitionManager.beginDelayedTransition()और कोई दुर्घटना नहीं हुई।


1

मैंने कॉल करके इस समस्या को हल किया

setHasStableIds(true);

एडेप्टर के निर्माता और getItemIdएडाप्टर में ओवरराइडिंग :

@Override
public long getItemId(int position) {
    return position;
}


0

मैं उपयोग करता हूं com.squareup.picasso.RequestCreator

public void into(android.widget.ImageView target,
             Callback callback)

इंटरनेट से चित्र डाउनलोड करने के बाद ImageView के आकार को गतिशील रूप से आकार दें, और आकार को संरक्षित करने के लिए आकार और चौड़ाई को बचाता है। मुझे यह अपवाद इसलिए मिला क्योंकि मैंने इसे अपने ऑनबाइंड व्यू फ़ोल्डर में सहेजा LayoutParamsथा Map, मैंने इसे पुनः प्राप्त किया और सीधे इसे मेरे लिए सेट कर दिया ImageView। मैं इसे ImmutablePair<Integer, Integer>केवल अन्य राज्यों के बजाय ImageView के आकार को संग्रहीत करने के लिए उपयोग करके ठीक करता हूं , और इसे पुनर्स्थापित करने के लिए निम्न कोड का उपयोग करता हूं ।

ViewGroup.LayoutParams params = image.getLayoutParams();
params.width = widthAndHeight.getLeft();
params.height = widthAndHeight.getRight();
image.setLayoutParams(params);

0

एक उच्च स्तर ViewGroup पर एक लेआउटट्रांसिशन की वजह से मेरे लिए एक ही बग।


0

कृपया मुझे इस तरह के मुद्दे के लिए एक और संभावित सुधार जोड़ने दें। मैं चिपचिपा हेडर के लिए सुपरस्लीम लाइब्रेरी के साथ एक ही समस्या थी RecyclerView। मैं MatrixCursorडेटा सेट करता था RecyclerViewCursorAdapter। इस मुद्दे का कारण 0सभी हेडर के लिए आईडी कॉलम था । आशा है कि किसी को कुछ दिनों के डिबगिंग को बचाने में मदद मिलेगी।


0

मेरे मामले में समस्या इस पद्धति के गलत तरीके से लागू होने की वजह से थी public long getItemId(int position)( RecyclerView.Adapterविधि से अधिभूत)।

पुराने कोड को एक ही आइटम के लिए दो अलग-अलग आईडी मिलेंगे (मेरे मामले में यह पाद लेख आइटम है), कार्यान्वयन को ठीक करने के बाद मुद्दा चला गया है।


0

यदि अपवाद का कारण क्या है, तो वर्कअराउंड समाधान, मूल दृश्य है। कोड में, जहाँ आपके पास InformItemRemoved (स्थिति) है, आइटम को RecyclerView से निकालें:

View itemView = mRecyclerView.getLayoutManager().findViewByPosition(position);
if (itemView != null && itemView.getParent() != null) {
    ((ViewGroup) itemView.getParent()).removeView(itemView);
}
notifyItemRemoved(position);

0

मेरे लिए एक अजीबोगरीब मामला यह था कि मेरे पास एडॉप्टर में एक दृश्य सदस्य था और मैं आलसी को तुरंत एक दृश्य दिखा रहा था जिसे रीसायकल दृश्य के साथ करने की कोई आवश्यकता नहीं है।

यह रीसायकल व्यू सिद्धांतों के खिलाफ भी जाता है जो इस मामले में आपके विचार के संदर्भ को संग्रहीत करता है। मैं नीचे एक त्वरित उदाहरण देता हूं:

// typically we would do this in a grid view adapter:
View v;
// ...
if(v = null){
v = LayoutInflater.inflate ...;
}

// Now with recycle view there is NO need to store a reference to View
// and lazy instantiate. So get rid of your View v member

0

इस अपवाद का कारण नहीं है

एंड्रॉयड: animateLayoutChanges

या

एंड्रॉयड: focusableInTouchMode

यह अंतिम सही उत्तर सिर्फ इसलिए है क्योंकि आपने एक गलत लेआउटप्रेम सेट किया है ।

    nameLP = new LinearLayout.LayoutParams(context.getResources().getDisplayMetrics().widthPixels, LinearLayout.LayoutParams.WRAP_CONTENT);
    nameLP2 = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);

nameLP ठीक है। nameLP2 क्रैश होता है .bug यहाँ है।

मैं इस पृष्ठ के सभी उत्तरों की कोशिश करता हूं। मुझ पर विश्वास करो।


0

क्योंकि मैं ऊपर लिख मैं इस समस्या थी equals()और hashcode()की विधि ViewHolderका RecyclerViewडेटा समानता और hashCode, की गणना के द्वारा .ViewHolder तो रीसायकल तर्क काम नहीं किया था और दुर्घटनाग्रस्त हो गया, मैं सिर्फ अधिलेखित और फिक्स्ड को हटा दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.