ListView或GridView上添加能一起滚动的Button效果的解决思路

思路Ⅰ:添加 Head View(推荐)

调用 ListView#addHeadView() 或 addFooterView() 来定制头尾特殊布局。

缺点:

  1. 数据下标影响。ListView的第一个元素变成了Button,要注意在adapter的getView()当中特别处理下标为0的情况。包括UI显示和事件监听。

  2. GridView控件官方没有提供addHeadView()方法。

备注:

  1. 其实AOSP项目中Gallery APP已经有ASIS提供的GridView的addHeadView()方法,实际使用过,有显示的问题,可能这也是AOSP没有将这个API公开的原因之一

  2. 如果不是GridView的话,个人比较推荐这种方案。

思路Ⅱ:Adapter#getView() 里根据 Index 灵活定制 layout

当 index 为 0 的时候加载 Button 布局,其他为一般布局,具体不再展开。

思路Ⅲ:ScrollView 嵌套 Button + ListView

当上述两种思路均无法满足需求的时候可以考虑此思路,缺点不少,但不失是一个折衷方案。

缺点:

  1. UI 问题:Android官方不建议在ScrollView内嵌套ListView或GridView,因为有如下Bug:

    • ListView在ScrollView中的高度会显示不完整,需要覆写ListView的onMeasure()复写最大 Size 的 Spec 实例解决这个问题

    • ListView在ScrollView中不能实时的滚动到顶部,需要在onWindowFocusedChanged()中手动调节ListView的位置

    大体:

     public class ListViewForScrollView extends ListView {
         ...
         @Override
         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
             // Int 值 32 位右移 2 位之后作为 Size 创建 Spec 实例
             // Spec 一共 32 位,高 2 位需要放 Mode
             // ListView 高度按照全部展开去计算
             int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
             MeasureSpec.AT_MOST);
             super.onMeasure(widthMeasureSpec, expandSpec);
         }
     }

  2. 性能影响:覆写ListView的onMeasure()会导致ListView的项目在只看到部分item的情况下,实际上已经将全部item加载完毕,会对性能造成影响

  3. 其他影响:正因为覆写ListView的onMeasure()导致ListView的全部item加载完毕,getFirstVisiblePosition()永远是0,getLastVisiblePosition永远是item总数。这种情况下,要用到getFirstVisiblePosition()和getLastVisiblePosition()的话,得到的结果是不正确的。

优点:

并不会影响到加载的数据的下标,不用在adapter的getView()当中特别处理下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TechMerger

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

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

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

打赏作者

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

抵扣说明:

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

余额充值