6


Trong RecyclerView mới, chúng tôi có thể sử dụng wrap_content cho chiều cao (hoặc chiều rộng). Vì vậy, lỗi cố định của Google - https://code.google.com/p/android/issues/detail?id=74772
Nhưng không phải tất cả đều tốt trong phần cuối.
Tôi cố gắng sử dụng hoạt ảnh bất hòa khi xóa mục khỏi RecyclerView. Vì vậy, tôi sử dụng phương pháp Adapter - notifyItemRemoved (int) với bất kỳ đối số và RecyclerView gây ra NullPointerException.

mã XML:NullPointerException trong hoạt ảnh bất thường của RecyclerView từ hỗ trợ v.23.2.0

... 
    <RecyclerView 
     android:id="@+id/RecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" 
     android:overScrollMode="always"/> 
    ... 



Logs:

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at android.support.v7.widget.SimpleItemAnimator.animateDisappearance(SimpleItemAnimator.java:78) 
    at android.support.v7.widget.RecyclerView.animateDisappearance(RecyclerView.java:3246) 
    at android.support.v7.widget.RecyclerView.access$700(RecyclerView.java:147) 
    at android.support.v7.widget.RecyclerView$4.processDisappeared(RecyclerView.java:422) 
    at android.support.v7.widget.ViewInfoStore.process(ViewInfoStore.java:231) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3086) 
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2914) 
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3277) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021) 
    at android.view.View.layout(View.java:14015) 
    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:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    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:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    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:14015) 
    at android.view.ViewGroup.layout(ViewGroup.java:4373) 
    at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
    at android.view.View.layout(View.java:14015) 
    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:5227) 
    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:795) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
    at dalvik.system.NativeStart.main(Native Method) 



Có thể có cách giải quyết tạm thời các vấn đề?

EDIT
tôi đã cố gắng để tái tạo trong dự án mới. Vì vậy, không có ngoại lệ nào được ném ra. Có lẽ trong dự án của tôi có những người phụ thuộc khác gọi là vấn đề này.

+0

Bạn có thể chia sẻ mã không! – Ajinkya

+0

Tôi gặp vấn đề tương tự. Tôi đoán đó là một lỗi trong thư viện hỗ trợ. Tôi thậm chí không animate mục nhập của tôi theo bất kỳ cách nào khác ngoài hoạt ảnh mặc định trong các phương thức thông báo ... – mhenryk

+0

Bạn có thể tạo báo cáo lỗi bằng ứng dụng mẫu sao chép sự cố của mình không? – yigit

Trả lời

5

Google đã đưa ra một số tuyên bố về việc sử dụng RecyclerView với phiên bản 23.2 của Thư viện hỗ trợ.

Liên kết với các bài viết trên blog (kiểm tra phần RecyclerView): http://android-developers.blogspot.com.br/2016/02/android-support-library-232.html

Do sự thay đổi này, hãy chắc chắn để kiểm tra các thông số bố trí các quan điểm mục của bạn tăng gấp đôi: thông số bố trí bị bỏ qua trước đó (chẳng hạn như MATCH_PARENT trong hướng cuộn) bây giờ sẽ được tôn trọng hoàn toàn.

Tôi khuyên bạn nên cố gắng thay đổi số layout_height của RecyclerView thành match_parent. Hãy cho chúng tôi biết nếu nó hoạt động.

+0

Đúng, với match_parent RecyclerView không gây ra ngoại lệ. Nhưng tôi cần trong wrap_content. –

+0

Vâng, tôi đã đọc một số cuộc thảo luận về nó, tôi nghĩ rằng bạn nên điền vào một lỗi tại http://b.android.com, như yigit đề nghị. –

0

Tôi có cùng một ngoại lệ. Điều này xảy ra khi tôi thêm chế độ xem vào RecyclerView và chế độ xem đó hoàn toàn nằm ngoài ranh giới của RecyclerView (người dùng sẽ phải cuộn để xem chế độ xem mới được thêm).

Tuy nhiên, tôi đã nhận thấy rằng ngoại lệ này chỉ xảy ra khi chiều rộng hoặc chiều cao của RecyclerViewwrap_content hoặc 0dp với trọng lượng thiết lập để 1 bên trong một LinearLayout ... Nếu tôi đặt chiều rộng và chiều cao đối với bất kỳ giá trị khác ngoại trừ hai, tức là 140dp, match_parent, sau đó mọi thứ hoạt động tốt. Vì vậy, tôi đã cố gắng để lừa khuôn khổ lỗi và tìm một giải pháp để thiết lập chiều rộng của RecyclerView của tôi là lớn như không gian còn lại bên trong LinearLayout của tôi có chứa RecyclerView (chiều rộng: 0dp, trọng lượng: 1) kết hợp), vì vậy tôi đã bọc RecyclerView bên trong LinearLayout khác với trọng số được đặt thành 1 và đặt chiều rộng của tôi là RecyclerView thành match_parent, vì vậy nó có chiều rộng như cha mẹ LinearLayout có thể nhận được và phụ huynh LinearLayout lấp đầy không gian trống ở một phụ huynh khác LinearLayout . Và thì đấy, nó hoạt động hoàn hảo!

tôi biết, nó có vẻ vô lý, nhưng đó là cách tôi làm việc nó ra ...

Dưới đây là mã nguồn nếu ai cần để có được những ý tưởng về cách để workaround lỗi này ...

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="10dp" 
    android:gravity="center" 
    android:orientation="horizontal"> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/pic_grid" 
      android:layout_width="match_parent" 
      android:layout_height="140dp" 
      android:background="#BBB"/> 

    </LinearLayout> 

    <Button 
     android:id="@+id/pic_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/pic_button"/> 

</LinearLayout> 

RecyclerView bây giờ rộng bằng không gian trống trong bố mẹ LinearLayout, cũng có một nút ở bên phải của RecyclerView và không có sự cố nào xảy ra.

Nếu ai phát hiện ra nguyên nhân thực sự của một ngoại lệ đó hoặc một cách tốt hơn để sửa chữa nó, xin vui lòng chia sẻ ...

8

tôi đã hoàn toàn lỗi tương tự như một trong những lớn lên trong câu hỏi và trong thực tế đã tăng một lỗi với Google cho việc này. Tôi đã tìm thấy, sau khi delving vào mã khuôn khổ, mà tôi có thể giải quyết vấn đề bằng cách thay đổi thiết lập của HasFixedSize từ FALSE thành TRUE nghĩa là "rv.setHasFixedSize (true)". Điều này về cơ bản nói với RecyclerView rằng những thay đổi đối với nội dung của nó sẽ không thay đổi kích thước RecyclerView do đó tránh bố trí đầy đủ. Ban đầu, tôi đã đặt FALSE này do hiểu sai ý nghĩa của nó. Thay đổi này loại bỏ lỗi cho tôi và là một giải pháp tái sản xuất.

+0

bạn đã cứu ngày của tôi ... !! cảm ơn rất nhiều bạn thân –

+0

'rv.setHasFixedSize (false);' đã làm các trick. Cảm ơn! – Meet

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