当RecycleView遇到layout_width="0dp"

在使用几个RecycleView横向排列时,父布局用LinearLayout,布局如下:

    "@+id/lottery_area"
        android:layout_width="225dp"
        android:layout_height="110dp"
        android:gravity="center"
        android:orientation="horizontal">

        .support.v7.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        .support.v7.widget.RecyclerView
            android:id="@+id/recyclerview2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        .support.v7.widget.RecyclerView
            android:id="@+id/recyclerview3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

    

这样设置后当添加到RecycleViewAdapter中显示的数据列表比较多或无限循环效果时,用6.0系统运行一切正常,但用5.0系统的手机运行就报异常了,提示ViewHolder出现java.lang.OutOfMemory异常。

WHY???

遇到这个错误,很是疑惑。为什么会造成内存溢出?RecyvleView不是只是先创建部分ViewHolder,然后之后会复用吗?

于是在Adapter的onCreateViewHolder和onBindViewHolder方法打印日志,一运行就一直不断打印日志,显示onCreateViewHolder不断被调用。

11-22 16:49:02.400 22383-22383/com.example.skybdemq.testglsurfaceview I/Adapter: com.example.skybdemq.testglsurfaceview.MainActivity$Adapter@18b3ad39onCreateViewHolder:7580
11-22 16:49:02.400 22383-22383/com.example.skybdemq.testglsurfaceview I/Adapter: com.example.skybdemq.testglsurfaceview.MainActivity$Adapter@18b3ad39onCreateViewHolder:7581
11-22 16:49:02.400 22383-22383/com.example.skybdemq.testglsurfaceview I/Adapter: com.example.skybdemq.testglsurfaceview.MainActivity$Adapter@18b3ad39onCreateViewHolder:7582

WHY??

虽然我在getItemCount()返回Integer.MAX_VALUE,但不应该还没显示就一直创建很多个ViewHolder阿。刚开始尝试将getItemCount设置为100,虽然不会内存溢出了,但onCreateViewHolder也被调用了超100次。一脸懵逼了,完全超出我的认知了。

好吧,有问题总要解决的。经过各种查,此外省略一大段吐槽,后来我这只瞎猫就真的碰上死耗子了。将上文布局recycleview的layout_width=”0dp”设置为layout_width=”match_parent”,一运行正常了。Unbelievable!!!又是各种尝试,还将布局设置竖向排列,将layout_height=”match_parent”设置为layout_height=”0dp”,但都一切正常,只有layout_width=”0dp”不正常。

于是又是各种查,想搜搜看网上能否找到相同的问题的帖子,但很遗憾,并没有。可能是很少多个RecycleView横向并排的场景吧。不过在stackoverflow找到一个比较类似的,是在23.2.x版本的RecycleView设置layout_height=”0dp”时出现。原来是Android的一个bug。我用的版本是26.0.2。

https://stackoverflow.com/questions/36065736/recyclerview-23-2-x-height-0dp-causes-onbind-called-for-all-items-and-scrolltopo

你可能感兴趣的:(android,android)