ScollView嵌套GridView,文字过多时候,会出现底部显示不全

需求: 整个页面外层是套有可滑动ScrollView,中间有动态显示的GridView,用来显示常用的服务Icon,最终效果如下:
在这里插入图片描述
  该需求支持以下两种特点: 1.最多显示两行文字; 2.多少文字都可以显示得出来,因为字体对应缩小了。

实现过程&遇到的问题:
1.因为GridView和ScrollView的滑动冲突问题,得重写GridView的onMeasure方法,使之支持嵌套在ScollView里面的时候,会直接全部渲染出来,而不用缓存机制。这样做的一个坏处是,如果有超级多item直接加载,会造成UI卡顿。

   /**
    * 重写onMeasure,让该GridView的高度永远是等于其所有item高度之和
    */
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
       super.onMeasure(widthMeasureSpec, expandSpec);
   }

2.ItemView里面是由ImageView和TextView组成,我当时想的做法是文字的高度用android:layout_height=“wrap_content”,这样就可以有多少字都可以动态显示多少字出来。若限定高度的话,就会出现文字过多的时候,后面的文字会显示不出来。
但是当我设置wrap_content的时候,文字超长的时候,就会出现如下图两个异常:
(1)异常一: 文字超过两行后,若超长的文字不是在GridView每行的最后一个Item,那么整个布局不会增大,但是文字会叠加到下面的Item上,如下图:
在这里插入图片描述

(2) 异常二: 文字超过两行后,若是在没每一行最后一个Item,那么会把整个这一行布局增大,但是最下面一行就会被挤出原先可视部分,此时怎么动态设置GridView的总高度都没用,如下图:
在这里插入图片描述

3.解决方法: 为了达到刚开始提的两个需求,目前想到的只能是当某个Item文字超长的时候,动态缩小文字的大小进行适配,处理的方法是利用8.0的兼容方法,用TextView的Autosizeing属性,如下代码,在Item布局的xml里面,加上app命名空间,以及固定TextView的高度,加入自动缩放的属性:

xmlns:app="http://schemas.android.com/apk/res-auto"

<TextView
    android:id="@+id/tv_text"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:layout_centerHorizontal="true"
    android:gravity="center_horizontal"
    android:textSize="12sp"
    android:textColor="#9b9b9b"
    android:maxLines="2"
    app:autoSizeTextType="uniform"
    app:autoSizeMinTextSize="5sp"
    app:autoSizeMaxTextSize="12sp"
    app:autoSizeStepGranularity="1sp"
    />

主要就是app:开头的这些属性和maxLine=2,具体效果就是开图的第一张图。

参考文章: https://www.cnblogs.com/plokmju/p/8268005.html

原创文章,欢迎转载,转载请注明:ifish.site

作者:JaydenZhou

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaydenZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值