记一次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的所有适配标准都是一致的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android ListView的一行中显示多个元素,可以使用自定义布局。以下是如何实现它的步骤: 1. 创建一个自定义布局文件,例如row_layout.xml。在此文件中,可以添加多个元素,例如ImageView、TextView等。 2. 在适配器中重写getView()方法。在此方法中,可以将自定义布局文件中的元素与数据绑定,并将其添加到ListView的每一行中。 3. 在Activity中,将适配器绑定到ListView上。 以下是一个示例代码: row_layout.xml: ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/imageView" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" /> </LinearLayout> ``` CustomAdapter.java: ``` public class CustomAdapter extends ArrayAdapter<String> { public CustomAdapter(Context context, ArrayList<String> data) { super(context, 0, data); } @Override public View getView(int position, View convertView, ViewGroup parent) { View itemView = convertView; if (itemView == null) { LayoutInflater inflater = LayoutInflater.from(getContext()); itemView = inflater.inflate(R.layout.row_layout, parent, false); } ImageView imageView = itemView.findViewById(R.id.imageView); TextView textView = itemView.findViewById(R.id.textView); // 绑定数据 String item = getItem(position); imageView.setImageResource(R.drawable.icon); textView.setText(item); return itemView; } } ``` MainActivity.java: ``` public class MainActivity extends AppCompatActivity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listView); ArrayList<String> data = new ArrayList<>(); data.add("Item 1"); data.add("Item 2"); data.add("Item 3"); CustomAdapter adapter = new CustomAdapter(this, data); listView.setAdapter(adapter); } } ``` 在此示例中,我们创建了一个自定义布局文件row_layout.xml,其中包含一个ImageView和一个TextView。然后,我们在CustomAdapter中重写了getView()方法,将数据绑定到自定义布局文件中的元素上,并将每个元素添加到ListView的每一行中。最后,在MainActivity中,我们将适配器绑定到ListView上,以显示多个元素的每一行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值