Android ListView高度自适应和ScrollView冲突解决

在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据。起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果。后来在网上查了查,ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起了冲突,一般不建议两者套用。

下面说说具体解决方案。方案的主要思路就是根据ListView子项重置其高度。

首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法:

 1 import android.content.Context;
 2 import android.util.AttributeSet;
 3 import android.widget.ListView;
 4
 5 public class MyListView extends ListView {
 6
 7     public MyListView(Context context) {
 8     super(context);
 9     }
10
11     public MyListView(Context context, AttributeSet attrs) {
12     super(context, attrs);
13     }
14
15     public MyListView(Context context, AttributeSet attrs, int defStyle) {
16     super(context, attrs, defStyle);
17     }
18
19     @Override
20     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
21         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
22                 MeasureSpec.AT_MOST);
23         super.onMeasure(widthMeasureSpec, expandSpec);
24     }
25
26 }

第二步:写个计算listView每个Item的方法:

 1 public void setListViewHeightBasedOnChildren(ListView listView) {
 2
 3   // 获取ListView对应的Adapter
 4
 5   ListAdapter listAdapter = listView.getAdapter();
 6
 7   if (listAdapter == null) {
 8
 9    return;
10
11   }
12
13   int totalHeight = 0;
14
15   for (int i = 0; i < listAdapter.getCount(); i++) { // listAdapter.getCount()返回数据项的数目
16
17    View listItem = listAdapter.getView(i, null, listView);
18
19    listItem.measure(0, 0); // 计算子项View 的宽高
20
21    totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
22
23   }
24
25   ViewGroup.LayoutParams params = listView.getLayoutParams();
26
27   params.height = totalHeight
28     + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
29
30   // listView.getDividerHeight()获取子项间分隔符占用的高度
31
32   // params.height最后得到整个ListView完整显示需要的高度
33
34   listView.setLayoutParams(params);
35
36  }

在设置LIstView的Adapter后调用此方法便可。

但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

1 listView.setAdapter(adapter);
2 setListViewHeightBasedOnChildren(listView);  

谢谢作者:http://www.jb51.net/article/37202.htm,http://blog.csdn.net/wulianghuan/article/details/8627958

时间: 2025-01-16 07:46:24

Android ListView高度自适应和ScrollView冲突解决的相关文章

Android ListView高度问题

有些页面中ListView只是整个页面的一小部分,需要上下滑动整个页面,ListView不让自己滑动,默认ListView只会显示第一个item.这个时候需要重新设置一下ListView的高度.如果ListView的item中有TextView并且TextView的行数大于1行,这个时候.重设ListView的高度却计算不出TextView的高度,会出现TextView只显示一行的情况.这个时候需要使用自定义的TextView,并且不要设置MaxLines这个属性. 设置ListView高度的代

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

最近项目有一个需求,需要多层可滑动控件的嵌套展示,demo效果如下,demo的下载地址在最后 咋一看好像挺简单啊,不就是一个ScrollView + ViewPager + ListView吗,我开始也这样觉得,也用的这种方式实现,结果始终和效果不对劲.这里总结几点问题: 两个或两个以上的滑动控件嵌套时,如果layout_height采用的是wrap_content会造成内部滑动控件的高度不能正确的计算,会导致内部滑动控件的高度始终为0,除非你用定值设置,比如300dp. 两个相同滑动方向的滑动

Android中ListVIew高度自适应,解决ScrollView冲突问题以及Android表格

效果图 类似格式, listView_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="ma

四种方法解决scrollview嵌套listview,listview高度确定问题

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

Android ListView 和 ScrollView 冲突问题

近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控件的内容就可以(对,感觉上有点像这个CSDN博客的编辑界面嘛),可是写出来之后发现ListView仅仅显示出了一个条目的高度.并且不能滑动,网上搜了一下发现原因是ScrollView和ListView都是可滑动的,把它们放在一块会有冲突.最后还是ScrollView获得了焦点.ListView不能滑

Android ListView焦点事件冲突问题与解决

Android ListView对于单纯列表展示是很好用的,但是一旦牵扯到对listView进行操作就会遇到各种各样的问题.比如保存Checkbox状态与item复用的冲突.遇到可获取焦点的控件比如说button.edxttext等与listView本身的点击事件冲突等.对于后者,这里不研究原因,只提供解决方案. 如果listView之中只有button这样会抢夺焦点的控件,最好的建议是直接把button换成Textview,直接规避焦点问题. 如果有些产品经理要求在listview的item中

Android listview viewpager解决冲突 滑动

Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第一栏添加 viewpager 当做header 如: 当触发 滑动事件 的时候容易引起 滑动冲突    (比如斜着滑动viewpager  的时候 listview会跳动) 特别是在  下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中 查阅了很多的帖子  发现修改起来都非常麻烦

android 有弹性的ScrollView 简单实现,与处理ScrollView和ListView,GridView之间的冲突

处理ScrollView和ListView,GridView之间的冲突, 最好的办法就是继承这两个类,重写他们的onMeasure方法即可: ListView: import android.widget.ListView; /** * ScrollView中嵌入ListView,让ListView全显示出来 * @author John * */ public class MyListView extends ListView{ public MyListView(android.conten

ListView和ScrollView冲突

当ListView放在ScrollView中的时候,无论你设置高度为 match_parent(填充父窗体)和wrap_content(包裹内容)都只显示一行,这是你把ListView放在LinearLayout 中,再给listview一个具体的高度,就可以显示多行了. 如: <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> <L