当RecycleView遇到layout_width="0dp"

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

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

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

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

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

    </LinearLayout>

这样设置后当添加到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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值