Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法

最近项目有一个需求,需要多层可滑动控件的嵌套展示,demo效果如下,demo的下载地址在最后



咋一看好像挺简单啊,不就是一个ScrollView + ViewPager + ListView吗,我开始也这样觉得,也用的这种方式实现,结果始终和效果不对劲。这里总结几点问题:

  • 两个或两个以上的滑动控件嵌套时,如果layout_height采用的是wrap_content会造成内部滑动控件的高度不能正确的计算,会导致内部滑动控件的高度始终为0,除非你用定值设置,比如300dp。
  • 两个相同滑动方向的滑动控件嵌套,会使其中一个控件的滑动事件失效。
  • 如果采用ScrollView作为最外层的滑动控件,则会产生莫名其妙的移位BUG,通过日志发现是scrollY的异常变化,但是通过scrollTo方法是无效的。
  • ViewPager嵌套ListView的时候,默认ViewPager的高度是所有ListView中最高的那个,因此会造成其他ListView底部会有一大片的补白。

上面是我总结的发生过的几个问题,也许你的问题就是上面中的几个,也许还有些问题没有总结到,不过我相信此篇博客一样会对你有帮助。
好了,我们首先列出来我们需要解决的几件事情。
  • 刚才说了,使用ScrollView作为最外层滑动控件来嵌套其他滑动控件,会有莫名其妙的位移BUG,因此应该换一种滑动控件作为最外层的容器。
  • 两个滑动控件嵌套,内部滑动控件的高度默认会是0,除非你用定值设置,如果不想用定值设置,那么就需要自定义这个滑动控件,手动的计算该滑动控件。
  • ViewPager嵌套ListView会有数据少的ListView底部出现一大片的空白,因此这里我们也需要自定义ViewPager来动态计算当前的ListView的高度。
  • ListView作为顶层滑动控件的子滑动控件ViewPager的子滑动控件,高度默认当然也是0,这里我们也需要进行自定义ListView计算高度。

首先我们解决第一个问题, 也就是拿什么控件来代替ScrollView作为顶层滑动控件。答案是ListView,有的小伙伴儿就不明白了,ListView作为顶层控件?不会吧这要怎么弄?说实话我当初采用ListView只考虑到一个原因:ListView不会有位移的BUG。接下来我用一张图来讲解。

由图中可以看到,顶层的ListView包含了两个部分,一个是Header,包括一些其他的控件以及IndicatorView导航条,然后就是ListView的Item了, 重点是这个Item的数量只有一个,也就是拿ViewPager作为Item。然后ViewPager里面嵌套了Fragment作为碎片的展示,每一个Fragment又包含了一个ListView作为数据列表的展示。下面给出最顶层的滑动控件的代码:
首先是Activity的布局文件:
actvity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="@android:color/transparent"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:listSelector="@android:color/transparent" />

很简单,就只是一个ListView。然后是MainActiivity.class:
public class MainActivity extends FragmentActivity {

    priv
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值