ScrollView嵌套ListView的显示不全及滑动问题 20C

需求描述:要在一个页面显示比较多的数据,如:旅图详情页面需要显示旅图照片、评论列表等等内容;而且页面可以上下滑动;当个人动态列表滑动到底部时,可以加载更多的评论。
如图-1:

旅图详情页

思路分析:因为要在一个页面显示较多的数据,且还有评论列表这样的模块,一下子想到使用ScrollView嵌套ListView,ScrollView可以上下滚动,ListView用于加载评论列表。

发现的问题:按照上面的思路,我做了尝试,发现两个问题:1) ListView显示不全:ListView只显示第一个。2) ListView不能上下滑动。
解决尝试:经过一番搜索,看到网上有这样的一些解决办法,本人都一一拿来尝试:
a) 在ScrollView的布局文件中加入配置android:fillViewport="true",试下来后发现ListView能显示的大一些了,充满了屏幕,但是还是不能滑动显示全部的评论。
b) 用代码设置ListView的高度,即根据ListView中item数目的个数设置ListView的高度,这样滑动屏幕就能将看到所有评论。
但问题又来了:因为评论数据可能会很多,现在的做法是进入旅图详情页面时,只展示部分评论,当页面下拉到最后一条评论时,通过“上拉加载更多”的滑动方式去查询更多评论,但是发现滑动不了,ListView滑动不了。为此又经过了一番的搜索,是因为ViewGroup的事件拦截和触发机制的原因,当然可给出了一些方法,为此又做了一些尝试:
c) 重写ScrollView的onInterceptTouchEvent()方法,直接返回false,即可将屏幕事件传递给子View,即可响应事件。
那么问题又来了,我只能把触摸点放在评论区域内,才能下拉加载更多,能不能触摸点在评论列表之外时,也能使评论区域上拉加载更多?另外如果想要使触摸屏幕上的任何一个点都可以往上滑动,该怎么做?因为发现当触摸点在评论列表上时,不能往上滑动,显示效果如图-2:

评论列表

其实我最终想要实现的目标就像是微博的具体内容展示页那样。
当然看到网上也有推荐不要用ScrollView嵌套,而使用ListView的header。
再此,希望高手能帮忙解答下!!!

8个回答

网上解决ScrollView嵌套ListView滑动冲突的有好多,下拉加载更多的方法这里我不建议在listview做,既然外层已经是ScrollView了,可以把下拉加载事件绑定到ScrollView,或者不要下拉加载换成点击加载更多。
然后,ScrollView嵌套ListView会一次性把所有的列表都加载绘制出来,需要资源和性能。如果可以尽量考虑用ListView,addHeaderView和addFooterView能解决大部分类似情况。

youshi520000
_有时丶 回复KaneTing: 是的。
大约 4 年之前 回复
XiaoYouSiFang
KaneTing 恩,我说错了,是想使用ListView的加载更多,而不是下拉刷新。那一般使用ListView的addHead么?
大约 4 年之前 回复

你需要重新定义一个listview,然后measure得到所有item的长度
http://yxwang0615.iteye.com/blog/1739187

XiaoYouSiFang
KaneTing 我试了下,是可以滑动显示全部的Item,但是我想上拉加载更多,这个怎么做?发现嵌套后,listView不能响应事件了
大约 4 年之前 回复

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**

  • @author jiarh *2014-8-14 */ public class UserListView extends ListView { public User......
    答案就在这里:ScrollView 嵌套ListView 滑动冲突,与显示不全
    ----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

非要用Scrollview嵌套Listview的话,Listview需要全部展开的,复写Listview的onMeasure方法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
            MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
}

不过这个有一个缺点就是无法复用,另外还有一个方案就是上半部分使用Header添加到Listview中去,其他的作为Item复用就可以了,建议用后者

XiaoYouSiFang
KaneTing 恩,对于事件的响应机制,研究了下感觉还是不知如何下手,所以决定采用给ListView添加Header的做法,谢谢!
大约 4 年之前 回复

我的博客 http://blog.csdn.net/q610098308/article/details/50349465
这个应该可以完美解决你的问题;因为我也遇到了这种情况;

XiaoYouSiFang
KaneTing 那事件响应的问题有遇到过么?
大约 4 年之前 回复

android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件

有去我博客里看最新的就是事件问题

重写ListView的onMeasure:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

如果你的下拉刷新用的XListView,也可以直接在里面的onMeasure中修改,不过还是推荐试用外层布局刷新,这里最好不要用ListView的刷新

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐