In new RecyclerView we can use wrap_content
for height (or for width). So Google fixed bug - https://code.google.com/p/android/issues/detail?id=74772
I have exactly the same exception. It occurs when I add a view to the RecyclerView
and that view is completely beyond the boundaries of the RecyclerView
(user would have to scroll to see that newly added view).
However, I've noticed that this exception only occurs when width or height of the RecyclerView
is wrap_content
or 0dp
with weight set to 1 inside a LinearLayout
... If I set the width and height to any other value except those two, i.e. 140dp
, match_parent
, then everything works fine.
So, I've tried to trick the buggy framework and find a solution to set the width of my RecyclerView
to be as big as there are space left inside my LinearLayout
that contains the RecyclerView
(width:0dp, weight:1 combination), so I wrapped the RecyclerView
inside another LinearLayout
with weight set to 1, and set my RecyclerView
's width to match_parent
, so it gets as wide as parent LinearLayout
can get, and the parent LinearLayout
fills the free space in another parent LinearLayout
. And voila, it works perfectly!
I know, it sounds ridiculous, but that's the way I worked it out...
Here's the source code if anybody needs to get the idea of how to workaround this bug...
<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>
The RecyclerView
now is as wide as there are free space in the parent LinearLayout
, which also contains one button to the right of the RecyclerView
, and no crashes occurs.
If anybody finds out the real cause of such an exception or a better way to fix it, please share...
I had exactly the same error as the one raised in the question and in fact have raised a bug with Google for this. I did find, after delving into the framework code, that I could resolve the issue by changing the setting of HasFixedSize from FALSE to TRUE i.e. "rv.setHasFixedSize(true)". This is basically telling the RecyclerView that changes to its contents will not change the RecyclerView size thus avoiding a full layout. I had originally set this FALSE due to a mis-interpretation of its meaning. This change removes the fault for me and is a reproducible solution.
Google has made some statement about the usage of the RecyclerView with the version 23.2 of the Support Library.
Link to the blog post (check the RecyclerView section): http://android-developers.blogspot.com.br/2016/02/android-support-library-232.html
Due to this change, make sure to double check the layout parameters of your item views: previously ignored layout parameters (such as MATCH_PARENT in the scroll direction) will now be fully respected.
I would suggest you to try to change your RecyclerView's layout_height
param to match_parent
. Let us know if it works.