RecyclerView gặp sự cố khi "các khung nhìn bị loại bỏ hoặc đính kèm có thể không được tái chế"


115

Tôi đang sử dụng một triển khai đơn giản RecyclerViewlấy từ trang web Android bằng cách sử dụng a StaggeredGridLayoutManagervà tôi tiếp tục gặp lỗi này khiến ứng dụng của tôi gặp sự cố:

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)  

Nói một cách đơn giản, ý tôi là cách triển khai tương tự được lấy từ trang này trên trang web của họ , điểm khác biệt duy nhất là bố cục của mục lưới của tôi là một ImageViewvà một vài TextViewký tự, vì vậy tôi sẽ không bận tâm đăng lại mã của mình.

Có ai khác gặp phải lỗi này không và biết cách đối phó với nó?


Bạn có giải pháp nào không?
Pratik Butani

Câu trả lời:


191

Lỗi này xảy ra nếu trong XML của bạn, bạn đã android:animateLayoutChangesđặt thành true và bạn gọi notifyDataSetChanged()bộ điều hợp của RecyclerView trong mã Java.

Vì vậy, chỉ cần tránh sử dụng android:animateLayoutChangesvới RecyclerViews.


22
thì làm cách nào để có thể sử dụng tính năng animateLayoutChanges trong Recyclerview?
dhuma1981

Bạn đang cố gắng đạt được điều gì? Hoạt ảnh mục? Nếu vậy, API RecyclerView hỗ trợ điều này - hãy xem tài liệu: developer.android.com/reference/android/support/v7/widget/…
Kenneth

4
@ dhuma1981 nếu công cụ hoạt ảnh của mục được đặt qua mRecyclerView.setItemAnimator (DefaultItemAnimator mới ()); sau đó animateLayoutChanges không cần đến mức khó tin
Giàu Ehmer

RecyclerViewsử dụng DefaultItemAnimatortheo mặc định.
Benjamin

-, - tôi có vấn đề này chính xác có bao u mô tả nó
Ninja Mã hóa

52

Tôi cũng đã phải đối phó với vụ tai nạn này và trong trường hợp của tôi, nó không liên quan gì android:animateLayoutChanges.

Các RecyclerViewchúng ta đang xây dựng có nhiều hơn một loại quan điểm trong đó và một số người đã có EditTexts trong đó. Sau một thời gian, chúng tôi đã xác định vấn đề có liên quan đến tiêu điểm. Lỗi này xảy ra trong khi tái chế EditTextvà một trong số chúng được tập trung.

Đương nhiên, chúng tôi đã thử xóa tiêu điểm khi dữ liệu mới đang được liên kết với chế độ xem tái chế nhưng điều đó không hoạt động cho đến khi android:focusableInTouchMode="true"được thiết lập RecycleView. Trên thực tế, đó là thay đổi duy nhất cần thiết cuối cùng để vấn đề này biến mất.


2
Tuyệt vời, đã giải quyết được nhiều vấn đề liên quan đến tiêu điểm mà tôi gặp phải khi sử dụng EditTexts trong RecyclerView. Cảm ơn!
Rabie Jradi

1
Tôi đã có ACET trong chế độ tái chế, và nó bị phá hủy. Bài đăng này đã cứu tôi.
Kai Wang

Và tôi không có biên tập trong các mục, mặc dù tôi có hộp kiểm. tôi có nên thử android:focusableInTouchMode="true"vì nó chỉ xảy ra đôi khi trong một số thiết bị (hiếm khi) và tôi đoán nó không liên quan đến vấn đề của tôi nhưng ngăn xếp dấu vết cho sự cố thì gần như tương tự.
Shivansh

Đây là trường hợp của tôi, nhưng thiết lập không android:focusableInTouchMode="true"giúp tôi chút nào. Vì vậy, tôi đã xóa tiêu điểm trong onViewDetachedFromWindowcuộc gọi lại. public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) { if (holder instanceof ItemViewHolder) { ItemViewHolder item = (ItemViewHolder) holder; if (item.editText.isFocused()) item.editText.clearFocus(); } }
artman

24

Tôi đã xóa thuộc tính android:animateLayoutChangesbố cục khỏi thuộc tính và sự cố đã được giải quyết.


Tôi bắt đầu gặp sự cố này khi tôi cũng đặt android:animateLayoutChangestrên RV của mình.
Mauker

2
Đã đặt cờ này trên vùng chứa mẹ (Bố cục tương đối). Đã khắc phục sự cố.
1911z

@ 1911z có phải bạn nói rằng bạn có cờ trên vùng chứa chính và việc xóa nó khỏi đó đã khắc phục được sự cố không?
RamPrasadBismil

14

Trong số các lý do mà bất kỳ ai cũng có thể gặp phải vấn đề này, hãy kiểm tra xem bạn đã đặt thuộc tính android:animateLayoutChanges="true"cho RecyclerView chưa. Điều này sẽ khiến việc tái chế và gắn lại các mục của RecyclerView không thành công. Xóa nó và gán thuộc tính cho vùng chứa mẹ của RecyclerView, chẳng hạn như LinearLayout / RelativeLayout và bạn sẽ thấy sự cố biến mất.


Tôi đã thấy sự cố này ngay cả khi tôi đã đặt thuộc tính trên vùng chứa mẹ của RV.
RamPrasadBismil

@RamPrasadBismil Vui lòng đăng mã của bạn và có thể chúng tôi có thể xem xét nó?
Ram Iyer

12

Tôi đã mất hai ngày nhưng không thể giải quyết vấn đề này, cuối cùng, tôi phải vô hiệu hóa tính năng tìm nạp trước của mục.

Khi đặt trình quản lý bố cục, bạn có thể chỉ cần gọi

mGridLayoutManager.setItemPrefetchEnabled(false);

Nó làm cho lỗi biến mất đối với tôi. Hy vọng nó sẽ hữu ích cho ai đó.


Đã làm cho tôi. Cảm ơn.
Vicky

1
Tôi thực sự lo lắng về việc mọi người áp dụng giải pháp này. Bạn mất rất nhiều việc vô hiệu hóa lá cờ này và lỗi vẫn là ở vị trí khác -
Felipe Castilhos

8

Trong khi sử dụng các tiêu đề dính slimfit, tôi đã gặp lỗi này. Nguyên nhân là do đặt sai vị trí đầu tiên. Tôi có câu trả lời ở đây

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

}

chỉ cần đảm bảo rằng bạn đang chuyển giá trị chính xác cho mSectionFirstPosition


Chào mừng bạn đến với StackOverflow. Bạn có thể vui lòng cung cấp câu trả lời đầy đủ thay vì chỉ một liên kết không?
slfan

cái gì itemở đây?
Lỗi xảy ra

Đây là mục danh sách sẽ được hiển thị trong chế độ xem người tái chế. Vì vậy, về cơ bản tôi đang lưu vị trí đầu tiên của phần đối với từng mục danh sách.
Jaspinder Kaur

8

Tôi đã gặp vấn đề này sáng nay, nhưng tôi không phải đối mặt với lý do tương tự như đã đề cập ở trên.

Thông qua gỡ lỗi, tôi thấy rằng chế độ xem mục trong ViewHolder của tôi có mParentvà nó không có giá trị rỗng, trong trường hợp bình thường nó không phải là không có (đó là những gì nhật ký nói, "chế độ xem đính kèm có thể không được tái chế", tôi nghĩ điều đó có nghĩa là nếu chế độ xem con đã được đính kèm với cha mẹ, nó sẽ gây ra lỗi khi tái chế.)

Nhưng tôi đã không đính kèm chế độ xem con mỗi lần theo cách thủ công. Và tôi thấy rằng điều đó đã hoàn thành khi tôi cố gắng tăng chế độ xem con trong ViewHolder của mình, giống như:

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

Và tham số cuối cùng attachToRootphải là false.

Sau khi tôi thay đổi nó thành false, tôi đã khắc phục được sự cố của mình.

Nhân tiện, tôi chỉ thấy sự cố này xảy ra khi tôi nâng cấp thư viện hỗ trợ của mình lên phiên bản mới nhất 25.0.0. Trước khi tôi sử dụng phiên bản 23.4.0 và tôi không thấy sự cố này xảy ra. Tôi đoán sẽ có điều gì đó thay đổi trong thư viện hỗ trợ mới nhất.

Hy vọng điều này giúp đỡ.


8

Tôi cũng gặp phải lỗi tương tự khi cuộn trên RecyclerView: sau đó tôi đã xóa animateLayoutChanges="true"trong tệp bố cục để RecyclerViewsau đó mọi thứ hoạt động.


6

Trong trường hợp của tôi, điều đó đã xảy ra vì tôi đã Transitionchạy khi cố gắng thay đổi kích thước RecyclerView vì bàn phím phần mềm sắp hiển thị.

Tôi đã sửa nó bằng cách loại trừ RecyclerView khỏi Transitionbằng cách sử dụng Transition.excludeTarget(R.id.recyclerview, true);


6

Có một số lý do tại sao ngoại lệ này được gọi. Trong trường hợp của tôi, đó là do các hoạt ảnh đang chạy, đó là lý do tại sao các chế độ xem vẫn được đính kèm và không thể xóa khỏi chế độ xem. Chỉ khi hoạt ảnh kết thúc như vậy, chế độ xem mới có thể được xóa và tái chế.

Có hai loại hoạt ảnh có thể ảnh hưởng đến việc tái chế chế độ tái chế.

1) Là RecyclerView.ItemAnimator - đây không phải là vấn đề. Điều này sẽ khá an toàn khi sử dụng vì nó kiểm tra các khung nhìn đính kèm và loại bỏ và xử lý tái chế đúng cách.

2) android:animateLayoutChanges="true"hoặc TransitionManager.beginDelayedTransition()hoặc TransitionManager.go (), v.v. - Các hoạt ảnh này tự chạy và giữ các mục để tạo hoạt ảnh. Điều này dẫn đến các khung nhìn buộc phải được đính kèm cho đến khi kết thúc hoạt ảnh. Chế độ xem tái chế không có bất kỳ kiến ​​thức nào về những hoạt ảnh này vì nó nằm ngoài phạm vi của nó. Do đórecyclerview có thể cố gắng tái chế một mục với suy nghĩ rằng nó có thể được tái chế đúng cách nhưng vấn đề là các API này vẫn giữ các chế độ xem cho đến khi hoàn thành hoạt ảnh.

Nếu bạn đang sử dụng android:animateLayoutChanges="true"hoặc TransitionManager.beginDelayedTransition()hoặc TransitionManager.go (), v.v., chỉ cần xóaRecyclerView và con của nó khỏi hoạt ảnh.

Bạn có thể đơn giản làm điều này bằng cách giữ Transitionvà gọi

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

Ghi chú:

Hãy lưu ý rằng điều quan trọng là sử dụng Transition.excludeChildren()để loại trừ tất cả Recyclerviewtrẻ em khỏi hoạt hình chứ không chỉ Recyclerviewchính nó.


Cảm ơn! TransitionManager.beginDelayedTransition () là nguyên nhân gây ra sự cố trong trường hợp của tôi. Bạn có thể cập nhật ví dụ mã của mình với nhiều chi tiết hơn về cách sử dụng Transition.excludeChildren. Bạn khởi tạo một đối tượng chuyển tiếp như val transition = AutoTransition():, gọi excludeChildren(recyclerView, true)đối tượng này và chuyển nó đến beginDelayedTransaction() as the second parameter.
Danilo Prado

5

Tôi cũng gặp phải lỗi này bất cứ khi nào tôi có animateLayoutChanges = "true" trong tệp bố cục cho RecyclerView. Xóa thuộc tính này và lỗi sẽ biến mất!


Xin lưu ý rằng câu hỏi này là từ năm 2014 và các thuộc tính có thể đã thay đổi vào lúc này.
Korashen

2
Không, nó vẫn chưa thay đổi
Sanjay Kushwah

4

Mặc dù trong trường hợp của tôi, nó đã bị xóa animateOnLayoutChangekhỏi RecyclerView để khắc phục sự cố, tôi vẫn cần khả năng tạo hiệu ứng cho các thay đổi bố cục trong viewHolder. Để làm cho điều này hoạt động, LinearLayout' in the view holder needs theanimateOnLayoutChange 'thành true, nhưng tôi cần notifyItemChangedbộ điều hợp. Sau đó, điều này cho phép cả hai hoạt ảnh layoutTransition khởi chạy (để mở rộng và thu gọn viewHolder), đồng thời tránh ngoại lệ bị loại bỏ. Vì vậy, có, tránh đặt animateOnLayoutChange trên recylcerView và sử dụng các phương pháp thông báo khác nhau để kích hoạt các hoạt ảnh mặc định khi thay đổi kích thước chế độ xem.


Tôi đang cố gắng làm điều tương tự để tạo hoạt ảnh cho phần mở rộng của mục, nhưng việc gọi thông báo với mục đích làtifyItemChanged trong bộ điều hợp làm cho mục này nhấp nháy sau khi thay đổi (hoạt ảnh hoạt động)! Làm thế nào để bạn ngăn chặn điều đó?
Flyview

Đối với trường hợp sử dụng của chúng tôi, chúng tôi đã kết thúc việc hoán đổi mã tùy chỉnh của mình bằng animateOnLayoutChange, để sử dụng bố cục có thể mở rộng. Nó hoàn thành điều tương tự như chúng tôi đã cố gắng hoàn thành nhưng theo cách linh hoạt hơn. github.com/chuross/expandable-layout
kingargyle

3

Tôi giải quyết vấn đề này bằng cách loại bỏ parent.addView() trongonCreateViewHolder

Đây là mã của tôi

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

Chức năng android.support.v7.widget.RecyclerViewRecycler.recyclerViewHolderinternal()kiểm tra xem nút của tôi đã là phụ huynh hay chưa. Mà nếu chúng ta thêm nút vào cha, nó cũng sẽ được gán RecyclerViewcho mParentbiến của nó .


Tôi nghĩ đó là một yêu cầu mới, tôi đã đính kèm với phụ huynh trong phiên bản 24 của hỗ trợ thư viện, sau khi cập nhật lên 25, tôi đã gặp sự cố.
Kirill Kulakov

1

Tôi thấy điều này xảy ra cho tôi khi tôi sử dụng một đối tượng tùy chỉnh trong ViewHolderchoRecyclerView adapter.

Để khắc phục sự cố, tôi đã xóa đối tượng tùy chỉnh mà trong trường hợp của tôi là bộ hẹn giờ trong onViewRecycled(ViewHolder holder)bộ điều hợp như bên dưới:

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

Điều này đã sửa lỗi.


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 、remove: xóa dữ liệu khỏi danh sách.

2 、notifyDataSetChanged: InformDataSetChanged ();

3 、notifyItemRemoved: hiển thị hình ảnh động.

4 、notifyItemRangeChanged: kích thước chế độ xem phạm vi và vẽ lạiviewHolders(onBindViewHolder methods)


Tôi đã thực hiện notifyItemRemovedkhi gỡ bỏ footervà ứng dụng gặp sự cố, hãy thay đổi nó thành notifyDataSetChangedvà bây giờ nó hoạt động tốt. cảm ơn bạn
Siarhei

1

Trong trường hợp của tôi, tôi đã sử dụng TransitionManager.beginDelayedTransition()trước khi thêm một chế độ xem trên đầu của Chế độ xem tái chế. Tôi đã gỡ bỏ các TransitionManager.beginDelayedTransition()và không có tai nạn.


1

Tôi đã giải quyết vấn đề này bằng cách gọi

setHasStableIds(true);

trong hàm tạo của bộ điều hợp và ghi đè getItemIdtrong bộ điều hợp:

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

1

Xóa android:animateLayoutChanges="true"khỏi xem xét lại hoặc thiết lậpandroid:animateLayoutChanges="false"


0

tôi sử dụng com.squareup.picasso.RequestCreator

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

để tự động thay đổi kích thước kích thước của ImageView sau khi tải ảnh xuống từ Internet, đồng thời lưu kích thước chiều rộng và chiều cao đã thay đổi kích thước để duy trì kích thước chế độ xem. Tôi nhận được Ngoại lệ này vì tôi đã lưu LayoutParamstrong a Mapvà trong onBindViewHolder của mình, tôi đã truy xuất nó và trực tiếp đặt nó thành của tôi ImageView. Tôi sửa lỗi này bằng cách sử dụng ImmutablePair<Integer, Integer>để chỉ lưu trữ kích thước của ImageView thay vì nhiều trạng thái khác và sử dụng mã sau để khôi phục nó.

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

0

Đối với tôi, lỗi tương tự do LayoutTransition gây ra trên ViewGroup cấp cao hơn.


0

Vui lòng để tôi thêm một bản sửa lỗi khả thi khác cho loại vấn đề này. Tôi đã gặp vấn đề tương tự với thư viện superSlim cho các tiêu đề dính trong RecyclerView. Tôi đã sử dụng MatrixCursorđể đặt dữ liệu thành RecyclerViewCursorAdapter. Lý do cho vấn đề này là các cột ID bằng 0với tất cả các tiêu đề. Hy vọng điều đó sẽ giúp ai đó tiết kiệm được vài ngày gỡ lỗi.


0

Trong trường hợp của tôi, sự cố là do việc triển khai phương pháp này không chính xác public long getItemId(int position)(được ghi đè từRecyclerView.Adapter phương thức).

Mã cũ sẽ nhận được hai id khác nhau cho cùng một mục (trong trường hợp của tôi, đó là mục chân trang), sau khi khắc phục sự cố triển khai.


0

Giải pháp thay thế nếu lý do Ngoại lệ là itemView có cha mẹ. Trong mã, nơi bạn có thông báo (vị trí), hãy xóa itemView khỏi RecyclerView:

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

0

Một trường hợp đặc biệt đã xảy ra với tôi là tôi có một thành viên chế độ xem trong bộ điều hợp và tôi lười khởi tạo một chế độ xem không cần phải làm với chế độ xem tái chế.

Nó cũng đi ngược lại các nguyên tắc chế độ xem khi bạn lưu trữ tham chiếu đến chế độ xem trong trường hợp này. Tôi đưa ra một ví dụ nhanh dưới đây:

// 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

ngoại lệ này không phải là nguyên nhân của

android: animateLayoutChanges

hoặc là

android: focusableInTouchMode

câu trả lời chính xác cuối cùng này chỉ là do bạn đặt một LayoutParams SAI .

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

tênLP là OK. tênLP2 xảy ra sự cố .bug ở đây.

Tôi thử tất cả các câu trả lời của trang này. tin tôi đi.


0

Tôi có vấn đề này bởi vì tôi ghi đè equals()hashcode()phương pháp ViewHoldercủa RecyclerView.ViewHolder bằng cách tính toán bình đẳng dữ liệu và hashcode, sau đó logic rác không làm việc và bị rơi, tôi chỉ loại bỏ các ghi đè và cố định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.