您的位置:首页 > 其它

四种方案解决ScrollView嵌套ListView问题

2014-08-25 16:12 357 查看
一、 为什么要使用ScrollView嵌套ListView的奇怪的结构



这是天猫商城的确认订单的页面,ScrollView中嵌套了ExpandableListView,ExpandableListView上面有固定的一些控件,下面也有固定的一些控件,整体又要能够滚动。 列表数据要嵌在固定数据中间,并且作为整体一起滚动,有了这样的设计需求,于是就有了ScrollView嵌套ListView的奇怪结构。

二、 ScrollView、ListView嵌套结构碰到的问题

不多说,直接看失败例子:



图中黑框的部分就是ListView,里面放了20条数据,但是却只显示了1条。

控件的属性设置上没有问题,但是为什么没有按照我的想法走呢?

看看下面这个图:


是否有点明白了呢?原因就是scroll事件的消费处理以及ListView控件的高度设定问题。

虽然我看源码也看了不少,但是要说出来却不知到该怎么下手,我是大概知道原因,但是不知道怎么整理完全。求高手赐教…

三、问题解决方案

1、手动设置ListView高度

经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量。于是手动代码设置ListView高度的方法就诞生了。

上面这个方法就是设定ListView的高度了,在为ListView设置了Adapter之后使用,就可以解决问题了。

但是这个方法有个两个细节需要注意:

一是Adapter中getView方法返回的View的必须由LinearLayout组成,因为只有LinearLayout才有 measure()方法,如果使用其他的布局如RelativeLayout,在调用listItem.measure(0, 0);时就会抛异常,因为除LinearLayout外的其他布局的这个方法就是直接抛异常的,没理由…。我最初使用的就是这个方法,但是因为子控件的顶
层布局是RelativeLayout,所以一直报错,不得不放弃这个方法。

二是需要手动把ScrollView滚动至最顶端,因为使用这个方法的话,默认在ScrollView顶端的项是ListView,具体原因不了解,求大神解答…可以在Activity中设置:

sv = (ScrollView) findViewById(R.id.act_solution_1_sv);

2、使用单个ListView取代ScrollView中所有内容

这个方法是我在试了几个方法都失败的情况下自己琢磨出来的。

用一张图来解释这个方法的思想:



就是说,把整个需要放在ScrollView中的内容,统统放在ListView中,原ListView上方的数据和下方数据,都作为现ListView的一个itemView,和原ListView中的单条数据是平级的关系。

xml布局方面十分简单:

一个单独的ListView就可以了。

原ListView上方数据和下方数据,都写进两个xml布局文件中



Java代码方面,需要自定义一个Adapter,在Adapter中的getView方法中进行position值的判断,根据position值来决定inflate哪个布局:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: