যখন "স্ক্র্যাপড বা সংযুক্ত ভিউগুলি পুনর্ব্যবহারযোগ্য না হতে পারে" তখন রিসাইক্লারভিউ ক্র্যাশ হয়


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

যদি আপনার এক্সএমএলে আপনি android:animateLayoutChangesসত্যতে সেট হয়ে থাকেন এবং আপনি কল করেন তবে এই ত্রুটি ঘটেnotifyDataSetChanged() করে রেখেছেন জাভা কোডটিতে রিসাইক্লারভিউ অ্যাডাপ্টারে করেন তবে ।

সুতরাং, কেবল android:animateLayoutChangesরিসাইক্লারভিউগুলি ব্যবহার করা এড়িয়ে চলুন ।


22
তারপরে রিসাইক্লিউরভিউতে কেউ কীভাবে অ্যানিমেট লেআউটচেন্জ বৈশিষ্ট্যটি ব্যবহার করতে পারে?
dhuma1981

আপনি কি অর্জন করার চেষ্টা করছেন? আইটেম অ্যানিমেশন? যদি তা হয় তবে পুনর্ব্যবহারযোগ্য ভিপিআইপি এটি সমর্থন করে - ডকুমেন্টেশনগুলি একবার দেখুন: বিকাশকারী.অ্যান্ড্রয়েড
কেনেথ

4
@ dhuma1981 আইটেম অ্যানিমেটারটি mRecyclerView.setItemAnimator (নতুন DefaultItemAnimator ()) এর মাধ্যমে সেট করা থাকলে; তাহলে অ্যানিমেটলআউটচেন্জেসগুলি সত্য হওয়ার দরকার নেই
রিচ এহমার

RecyclerViewDefaultItemAnimatorডিফল্টরূপে ব্যবহার করে।
বেঞ্জামিন

-, - আপনি ঠিক কীভাবে বর্ণনা করেছেন তাতে আমার এই সমস্যাটি রয়েছে
নিনজা কোডিং

52

আমারও এই ক্র্যাশটি মোকাবেলা করতে হয়েছিল এবং আমার ক্ষেত্রে এটির কোনও সম্পর্ক ছিল না android:animateLayoutChanges

RecyclerViewআমরা ভবন ছিল সেটা এটি এবং কিছু দেখা হয়েছে তার এক একটির বেশি টাইপ জমিদারি ছিল EditTextতাদের মধ্যে সে। কিছুক্ষণ পরে আমরা বিষয়টিকে ফোকাস সম্পর্কিত হতে পিন করেছি। এই ত্রুটি পুনর্ব্যবহারের সময় ঘটে এবং EditTextএর মধ্যে একটি ফোকাস করা হয়।

স্বাভাবিকভাবেই আমরা ফোকাসটি সাফ করার চেষ্টা করেছি যখন নতুন ডেটা পুনর্ব্যবহৃত দৃশ্যের সাথে আবদ্ধ হয় তবে এটি android:focusableInTouchMode="true"সেট না হওয়া পর্যন্ত কাজ করে না RecycleView। আসলে এই সমস্যাটি দূরে যাওয়ার জন্য শেষ মুহুর্তে কেবলমাত্র সেই পরিবর্তনটিই দরকার ছিল।


2
একটি পুনর্ব্যবহারযোগ্য ভিউতে editTexts ব্যবহার করার সময় আমার কাছে ফ্যান্টাস্টিক, একাধিক ফোকাস সম্পর্কিত সমস্যাগুলি সমাধান হয়েছিল। ধন্যবাদ!
রাবি জেরাদি

1
আমার রিসাইক্লারভিউতে ACET ছিল এবং এটি ক্রাশ হয় us এই পোস্টটি আমাকে বাঁচায়।
কাই ওয়াং

এবং আইটেমগুলিতে আমার সম্পাদনা নেই, যদিও আমার চেকবক্স রয়েছে। আমার চেষ্টা করা উচিত 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"পারে তার মধ্যে, আপনি পুনর্বিবেচকদর্শনটির জন্য বৈশিষ্ট্যটি সেট করে রেখেছেন কিনা তা পরীক্ষা করে দেখুন। এটি পুনর্ব্যবহারযোগ্য এবং পুনর্ব্যবহারযোগ্য আইটেমগুলিকে পুনরায় সংযুক্ত করতে ব্যর্থ করবে। এটি সরান এবং পুনর্ব্যবহারযোগ্য ভিউ এর মূল পাত্রে যেমন একটি লিনিয়ারলআউট / রিলেটিভলআউট হিসাবে নির্ধারণ করুন এবং আপনার সমস্যাটি দূরে চলে যাওয়া উচিত।


আরভি-র মূল পাত্রে বৈশিষ্ট্যটি সেট করেও আমি এই ক্র্যাশটি দেখেছি।
রামপ্রসাদবিসমিল

@ রমপ্রসাদ বিসমিল দয়া করে আপনার কোড পোস্ট করুন এবং সম্ভবত আমরা এটি দেখতে পারি?
রাম আইয়ার

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);

}

কেবল নিশ্চিত করুন যে আপনি এমসেকশনফার্সপজিশনের জন্য সঠিক মানটি পার করছেন


স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। আপনি কি দয়া করে কেবল একটি লিঙ্কের পরিবর্তে একটি পূর্ণ উত্তর সরবরাহ করতে পারেন?
slpan

itemএখানে কি ?
বাগগুলি

এটি তালিকার আইটেম যা পুনর্ব্যবহারযোগ্য দৃশ্যে প্রদর্শিত হবে। সুতরাং মূলত আমি প্রতিটি তালিকার আইটেমের বিপরীতে বিভাগটি প্রথম অবস্থানে সংরক্ষণ করছি।
জসপিন্দর কৌর

8

আমি আজ সকালে এই সমস্যাটি পূরণ করেছি, তবে উপরে বর্ণিত একই কারণে আমি মুখোমুখি হচ্ছি না।

ডিবাগের মাধ্যমে আমি দেখতে পেলাম যে আমার ভিউহোল্ডারের আইটেম ভিউটিতে রয়েছে mParent এবং এটি বাতিল নয়, যা সাধারণ ক্ষেত্রে এটি হওয়া উচিত নয় ( যা "সংযুক্ত ভিউটি পুনর্ব্যবহৃত হতে পারে না"), আমি মনে করি এটির অর্থ যদি শিশু দেখায় ইতিমধ্যে একটি পিতামাতার সাথে সংযুক্ত, এটি পুনরায় ব্যবহারের সময় কীভাবে ব্যর্থতার কারণ হতে পারে))

তবে আমি প্রত্যেকবার ম্যানুয়ালি সন্তানের দৃষ্টিভঙ্গি সংযুক্ত করি নি। এবং আমি দেখতে পেলাম যে যখন আমি আমার ভিউহোল্ডারটিতে শিশু দৃষ্টিভঙ্গি উত্সাহিত করার চেষ্টা করি তখন এটি হয়ে যায়:

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

এবং শেষ প্যারামিটারটি attachToRootমিথ্যা হওয়া উচিত।

আমি এটিকে পরিবর্তন করার পরে false, আমি আমার সমস্যাটি স্থির করেছি।

যাইহোক, আমি কেবল তখনই দেখি যখন আমার সমর্থন লাইব্রেরিটি সর্বশেষ সংস্করণ 25.0.0 এ আপগ্রেড করা হবে। আমি 23.4.0 সংস্করণ ব্যবহার করার আগে এবং আমি এই সমস্যাটি ঘটতে দেখছি না। আমার ধারণা সর্বশেষ সমর্থন লাইব্রেরিতে কিছু পরিবর্তন হওয়া উচিত।

এই সাহায্য আশা করি।


8

এতে স্ক্রোল করার সময় আমিও একই ত্রুটির মুখোমুখি হয়েছি RecyclerView: তারপরে আমি animateLayoutChanges="true"লেআউট ফাইলে সরিয়েছি RecyclerViewতখন সমস্ত কিছু কাজ করে।


6

আমার ক্ষেত্রে এটি ঘটেছিল কারণ আমার একটি ছিল Transition রিসাইকেলার ভিউটিকে পুনরায় আকার দেওয়ার চেষ্টা করার সময় দৌড় কারণ সফ্টওয়্যার কীবোর্ডটি প্রায় দেখা যাচ্ছে।

আমি এটি Transitionব্যবহার করে পুনর্ব্যবহারযোগ্য ভিউ বাদ দিয়ে আমার স্থির করেছিTransition.excludeTarget(R.id.recyclerview, true);


6

এই ব্যতিক্রমটি ডাকা হওয়ার কারণ রয়েছে। আমার ক্ষেত্রে এটি অ্যানিমেশনগুলি চলার কারণে ঘটেছিল কেন দর্শনগুলি এখনও সংযুক্ত রয়েছে এবং দৃশ্যে সরানো যায়নি। যখন অ্যানিমেশনটি শেষ হয় কেবল তখনই দৃশ্যটি সরানো এবং পুনর্ব্যবহার করা যেতে পারে।

অ্যানিমেশন দুটি ধরণের রয়েছে যা পুনর্ব্যবহারযোগ্য পুনর্ব্যবহারকে প্রভাবিত করতে পারে।

1) হয় RecyclerView.ItemAnimator - এই সমস্যা হওয়া উচিত নয়। এটি ব্যবহার করা বেশ নিরাপদ হওয়া উচিত কারণ এটি সংযুক্তি এবং স্ক্র্যাপ করা ভিউগুলি এবং সঠিকভাবে পুনর্ব্যবহার পরিচালনা করে।

2) android:animateLayoutChanges="true"বা TransitionManager.beginDelayedTransition()বা ট্রানজিশন ম্যানেজ.আরগো () ইত্যাদি These এই অ্যানিমেশনগুলি নিজেরাই চলতে থাকে এবং এ্যানিমেটগুলিকে সঞ্জীবিত করতে ধরে রাখে। অ্যানিমেশন শেষ না হওয়া পর্যন্ত দৃশ্যের সাথে দৃশ্যের সাথে যুক্ত হওয়া জোর করে। রিসাইক্লারভিউটিতে এই অ্যানিমেশনগুলির কোনও জ্ঞান নেই কারণ এটি এর আওতার বাইরে। সুতরাং এটি 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

আমি যখনই রিসাইক্লার ভিউয়ের জন্য লেআউট ফাইলটিতে অ্যানিমেটলআউটচ্যাঞ্জস = "সত্য" ছিলাম তখনও আমি এই ত্রুটিটি পেয়ে যাচ্ছিলাম। এই বৈশিষ্ট্যটি মুছুন এবং ত্রুটি অদৃশ্য হয়ে যাবে!


দয়া করে মনে রাখবেন যে এই প্রশ্নটি ২০১৪ সালের এবং সম্পত্তিগুলি এখনই পরিবর্তিত হতে পারে।
কোরাশেন

2
এটি এখনও পরিবর্তিত হয়নি
সঞ্জয় কুশওয়াহ

4

আমার ক্ষেত্রে এটি animateOnLayoutChangeক্র্যাশটিকে স্থির করে এমন পুনর্ব্যবহারযোগ্য ভিউ থেকে অপসারণ করছে, তবুও আমার ভিউহোল্ডারের মধ্যে বিন্যাসের পরিবর্তনগুলি সঞ্চার করার দক্ষতার প্রয়োজন ছিল। LinearLayout' in the view holder needs theএটির কাজ পেতে, অ্যানিমেটঅনলআউটচ্যাঞ্জ 'থেকে সত্য, তবে notifyItemChangedঅ্যাডাপ্টারে আমার দরকার ছিল । এটির পরে লেআউটট্রান্সিশন অ্যানিমেশন উভয়কেই (ভিউহোল্ডারটি প্রসারিত ও সংকোচন করার জন্য) কিক অফ করার অনুমতি দেয় এবং স্ক্র্যাপযুক্ত ব্যতিক্রমও এড়ানো যায়। তাই হ্যাঁ, রিসাইক্লিউউতে অ্যানিমেটঅনলআউটআউটচ্যাঞ্জিং এড়ান এবং ভিউ আকারের পরিবর্তনের ক্ষেত্রে ডিফল্ট অ্যানিমেশনগুলিকে সক্ষম করতে বিভিন্ন বিজ্ঞপ্তি পদ্ধতি ব্যবহার করুন।


আমি আইটেমটির সম্প্রসারণ অ্যানিমেট করার জন্য একই জিনিসটি করার চেষ্টা করছি, তবে অ্যাডাপ্টারে নোটিফাইম আইটেম চেঞ্জ করা কলটি আইটেমটি পরিবর্তনের পরে ফ্ল্যাশ করে তোলে (অ্যানিমেশন কাজ করে)! আপনি কীভাবে এটি প্রতিরোধ করবেন?
ফ্লাইভিউ

আমাদের ব্যবহারের ক্ষেত্রে আমরা প্রসারণযোগ্য-বিন্যাসটি ব্যবহার করতে, অ্যানিমেটঅনলআউটচ্যাঞ্জ ব্যবহার করে আমাদের কাস্টম কোডটি অদলবদল করেছিলাম। এটি একই জিনিসটি সম্পাদন করে যা আমরা অর্জন করার চেষ্টা করছিলাম তবে আরও নমনীয় way github.com/chuross/expandable-layout
কিংগারজিল

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 、removelist তালিকা থেকে ডেটা সরান।

2 notifyDataSetChanged;: notifyDataSetChanged ();

3 、notifyItemRemovedanima অ্যানিমেশন দেখান।

4 、notifyItemRangeChanged: পরিসীমা দেখার আকার এবং redviewHolders(onBindViewHolder methods)


আমি notifyItemRemovedমুছে ফেলার সময় footerএবং অ্যাপ্লিকেশন ক্র্যাশগুলি করেছি, এটিকে পরিবর্তন করুন notifyDataSetChangedএবং এখন এটি ঠিক আছে। আপনাকে ধন্যবাদ
সিয়েরেই

1

আমার ক্ষেত্রে, আমি TransitionManager.beginDelayedTransition()পুনর্ব্যবহারযোগ্য ভিউয়ের উপরে একটি ভিউ যুক্ত করার আগে ব্যবহার করেছি । আমি 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)

ইন্টারনেট থেকে ডাউনলোডের চিত্রের পরে ইমেজভিউয়ের আকারকে গতিশীল আকারে পরিবর্তন করতে এবং দেখার আকারটি সংরক্ষণের জন্য পুনরায় আকার এবং প্রস্থ এবং উচ্চতা সংরক্ষণ করে। কারণ আমি সংরক্ষিত আমি এই ব্যতিক্রম পেয়েছিলাম LayoutParamsএকটি Map, এবং আমার onBindViewHolder মধ্যে, আমি এটা উদ্ধার করা এবং সরাসরি আমার কাছে এটি সেট ImageView। আমি ImmutablePair<Integer, Integer>অন্যান্য অনেক রাজ্যের চেয়ে কেবল চিত্র ভিউয়ের আকার সঞ্চয় করতে ব্যবহার করে এটি ঠিক করেছি এবং এটি পুনরুদ্ধার করতে নিম্নলিখিত কোড ব্যবহার করব।

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

0

আমার জন্য একই স্তরের একটি উচ্চ স্তরের ভিউগ্রুপে লেআউটট্রান্সশনের কারণে হয়েছে caused


0

দয়া করে এই ধরণের সমস্যার জন্য আরও একটি সম্ভাব্য সংশোধন করুন। আমি স্টিকি হেডারগুলির জন্য সুপারস্লিম লাইব্রেরিতে একই সমস্যা ছিল RecyclerView। আমি MatrixCursorডেটা সেট করতে ব্যবহৃত RecyclerViewCursorAdapter। এই ইস্যুটির কারণ ছিল আইডি কলামগুলি 0সমস্ত শিরোনামের সমান । আশা করি যে কাউকে কয়েক দিনের ডিবাগিংয়ের সঞ্চয় করতে সহায়তা করবে।


0

আমার ক্ষেত্রে সমস্যাটি ছিল এই পদ্ধতিটির ভুল প্রয়োগের কারণে public long getItemId(int position)( RecyclerView.Adapterপদ্ধতি থেকে বাদ দেওয়া )।

পুরানো কোডটি একই আইটেমটির জন্য দুটি পৃথক আইডি পাবে (আমার ক্ষেত্রে এটি পাদলেখক আইটেম), প্রয়োগটি স্থির করার পরে সমস্যাটি চলে গেছে।


0

ব্যতিক্রমের কারণ যদি কার্যবিধির সমাধান আইটেমভিউয়ের পিতা-মাতার থাকে is কোডে, যেখানে আপনি আইটেম সরানো (অবস্থান) অবহিত করেছেন, পুনর্ব্যবহারযোগ্য থেকে আইটেম ভিউ সরান:

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);

নাম এলপি ঠিক আছে। নাম LP2 ক্র্যাশ ঘটে .বাগ এখানে।

আমি এই পৃষ্ঠার সমস্ত উত্তর চেষ্টা করে দেখুন। আমাকে বিশ্বাস কর.


0

কারণ আমি ওভাররাইট আমি এই সমস্যা ছিল equals()এবং hashcode()পদ্ধতি ViewHolderএর RecyclerViewডেটা সমতা এবং হ্যাশকোড, গণনা করে .ViewHolder তারপর রিসাইকেল যুক্তিবিজ্ঞান কাজ করে নি এবং ক্র্যাশ, আমি শুধু ওভাররাইট করে, এবং সংশোধন করা হয়েছে মুছে ফেলুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.