2016-03-04 19 views
7

Một số nhà phát triển đã thông báo nhìn thấy những vết đống sau kể từ khi nâng cấp lên Android Hỗ trợ 23.2.0:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$ViewHolder.shouldIgnore()' on a null object reference 
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2913) 
    at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1445) 
    at android.support.v7.widget.RecyclerView.access$400(RecyclerView.java:144) 
    at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:282) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:821) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:606) 
    at android.view.Choreographer.doFrame(Choreographer.java:575) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:807) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:145) 
    at android.app.ActivityThread.main(ActivityThread.java:6895) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

này xảy ra khi hoạt ảnh thay đổi của RecyclerView được kích hoạt và các phương thức RecyclerView.Adapter tương ứng notifyItemInserted(), notifyItemRemoved(), vv, được gọi để chỉ ra rằng một thay đổi riêng biệt đã được thực hiện cho danh sách được quản lý bởi bộ điều hợp (trái ngược với thay đổi bán buôn) bởi notifyDataSetChanged()).

Đây có phải là do lỗi trong RecyclerView hay chúng tôi là nhà phát triển làm điều gì đó sai?

+1

Vấn đề báo cáo đã được cố định trong hỗ trợ trong tương lai thư viện. Nếu bạn gặp lại vấn đề này trong các thư viện hỗ trợ trong tương lai, vui lòng cho chúng tôi biết bằng cách đưa ra một vấn đề mới với tất cả các thông tin cần thiết bao gồm cả một ứng dụng mẫu. Nếu bất kỳ vấn đề nào vẫn tồn tại, vui lòng báo cáo tại bộ theo dõi vấn đề của Google, chúng sẽ mở lại để kiểm tra. https://issuetracker.google.com/issues/37078411 –

Trả lời

2

Điều này có vẻ là do lỗi trong RecyclerView, được giới thiệu trong 23.2.0. Lỗi này được báo cáo here và tôi đã giải thích những gì tôi cho là gây ra lỗi trong comment #5 trên lỗi đó.

Dưới đây là giải thích của tôi, sao chép ở đây cho mục đích lịch sử và dễ tham khảo:

tôi tìm thấy nguồn gốc của vấn đề này. Trong vòng RecyclerView.dispatchLayoutStep3(), có vòng lặp for, "cho (int i = 0; i < đếm; ++ i)", trong đó số được dựa trên mChildHelper.getChildCount(). Trong khi lặp lại này xảy ra, bộ sưu tập được quản lý bởi ChildHelper được sửa đổi bởi ChildHelper.hideViewInternal(), kết quả là không được trả lại từ cuộc gọi đến mChildHelper.getChildAt() trên dòng 3050 của RecyclerView, do đó dẫn đến null được trả về từ getChildViewHolderInt() trên cùng một dòng mã (RecyclerView: 3050).

Đây là chuỗi các phương pháp gọi là có kết quả trong việc sửa đổi đó phá vỡ sự toàn vẹn của vòng lặp for:

dispatchLayoutStep3() -> animateChange() -> addAnimatingView() -> hide() -> hideViewInternal()

Khi ChildHelper thêm thông số con vào bộ sưu tập mHiddenViews của nó, nó vi phạm tính toàn vẹn của đường vòng lặp lên trong dispatchLayoutStep3().

Tôi thấy hai cách giải quyết cho việc này:

1) Vô hiệu hoá sự thay đổi hình ảnh động trong RecyclerView bạn

2) Downgrade để 23.1.1, nơi này không phải là một vấn đề

+0

Cảm ơn bạn đã biết thông tin, lỗi này dường như được sửa trong 23.2.1 (ít nhất nó hoạt động đối với tôi bây giờ) –

+2

Tôi đang gặp sự cố này trong phiên bản 24.2.1. Tôi đang cố gắng thêm scrollerview theo lập trình. –

+1

25.0.0 được reprodused lỗi này với setHasStableIds (true) – iscariot

0

tôi gặp với ngoại lệ này ngay bây giờ và tôi đã sửa nó bằng cách thay đổi framgent thành FragmentLayout.

Bộ điều hợp của tôi đã sử dụng một số dữ liệu trong đối số phân đoạn và việc sử dụng fragment trong xml không điền dữ liệu, do đó lỗi xảy ra.

Chỉ cần đăng bài này tại đây, có thể hữu ích cho ai đó.

2

Trong trường hợp của tôi, lỗi gây ra bởi vì Tôi đã đặt RecyclerView mới.LayoutParams vào trong rootview của một mục.

Sau đó, tôi nhận ra rằng lượt xem mục RecyclerView thực sự lưu trữ ViewHolders của họ trong một lớp LayoutParams tùy chỉnh. Vì vậy, khi tôi đặt lại tham chiếu Chế độ xem ViewParams sẽ biến mất vĩnh viễn. Điều này gây ra lỗi NullPointerException sau này.

Sự cố đã biến mất sau khi tôi ngừng đặt RecyclerView.LayoutParams vào mục rootView. :)

So. Dừng làm điều đó trong ViewHolder của bạn:

RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
itemRoot.setLayoutParams(params); 
0

Nếu bạn hoàn toàn cần phải sửa đổi params bố trí, bạn có thể sử dụng params bố cục mục mặc định như thế này:

ViewGroup.LayoutParams params = itemView.getLayoutParams(); 
    params.height=xx; 
    params.width= xx; 
    params.yyyy = xxx; 
    itemView.setLayoutParams(params); 
Các vấn đề liên quan

 Các vấn đề liên quan