记一次AndroidAutoSize引起的ListView显示异常的bug

一、复现场景

场景一:首页是任务列表,采用了SmartRefreshLayout,当我下拉刷新的时候,此时执行刷新动画,然后快速的点击到个人中心页,当我关闭个人中心页回退到首页时,发现首页的任务列表的item都变小了(有的时候会个别item显示正常,有的显示很小)
场景二:页面首先是强制竖屏的,先锁屏然后横放pad,此时锁屏是横屏页面,在横屏状态下解锁,此时首页ListView个别item显示异常。
场景三:横竖屏页面互相跳转,也会有显示异常的情况

二、问题分析

  1. 复现场景并不是在所有设备上都能复现,个别设备上是必现的,开始怀疑是SmartRefreshLayout里嵌套的RecycleView有问题,就换成了ListView,最后还是复现了,经排查是Autozise适配导致的,出现这个问题的原因是首页适配的宽度是640dp,而除了首页适配的宽度都是960dp,一开始就是因为项目上没和设计沟通好导致适配宽度是640dp,后来为了统一就所有的页面都是960dp宽度来适配。
  2. 当时为了省事没有调整UI布局而是首页单独实现了CustomAdapt接口,指明了适配的宽度是640dp
  3. 在没有用SmartRefreshLayout之前是没有这个问题的,后来把RefreshLayout替换之后才出现的这个问题,经分析RefreshLayout在下拉刷新和上拉加载时动画时间很短,数据很快就渲染到listview上了,但是SmartRefreshLayout动画执行时间比较长,在执行动画的时候,就打开了个人中心页,此时Autozise根据960dp的宽修改了density,而栈下面的首页此时动画执行完毕要渲染listview的时候采用了960dp宽的适配后的density,因为在返回到首页的时候listview显示的数据会很小

三、问题解决

  1. 将首页所有的布局尺寸大小都✖️1.5 然后取消自定义适配宽度就可以了(取消实现CustomAdapt接口)
  2. 也可以不用取消实现CustomAdapt接口,只需要在显示异常的页面上加入以下代码即可解决
@Override
    public Resources getResources() {
    
    
        //需要升级到 v1.1.2 及以上版本才能使用 AutoSizeCompat
        AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources());//如果没有自定义需求用这个方法
        AutoSizeCompat.autoConvertDensity((super.getResources(), 667, false);//如果有自定义需求就用这个方法
        return super.getResources();
    }

第二个方法同样可以解决安卓锁屏之后横竖屏切换导致界面显示异常的bug
更多使用AutoSize的技巧

四、总结
Autozise还是挺优秀的适配框架的,只是在使用过程中要多加注意,尽量的保证整个APP的所有适配标准都是一致的。

猜你喜欢

转载自blog.csdn.net/qq_36356379/article/details/114935305