ScrollView 里面 嵌套ListView 导致listview无法完全显示数据的问题

来源:互联网 发布:知乎 清华法学院体验 编辑:程序博客网 时间:2024/05/19 03:21

导言---   本人Android小白一个,哈哈,总结下自己的辛苦历程,供自己回顾以及同各位大牛交流。如有错误,敬请留言交流。

                                                                                               一入编程深似海,回头白发已苍苍。   ----木木小黑



相信大家做Android的,一定会碰到这么一个问题,ScrollView 里面 嵌套ListView怎么整?之前我是直接放弃ScrollView 。后来的后来,项目需求必须这么玩。。(醉了)。在网上找了跟多例子,这里先介绍几个不能实现的例子吧。(起码我没成功。。。)

    1. 直接在ScrollView的xml文件里加上 android:fillViewport="true" 这个属性。  个人表示,不得行。网上说设置父布局的高度为充满。亲测不行呐。

 2. 新弄个类。名字随意。内容贴上:

public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
ViewGroup.LayoutParams params = listView.getLayoutParams();
if (listAdapter == null) {
return;
}


int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}



params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
 
}

然后,在主activity中。在listview.setAdapter后 加上   XXXX(类名).setListViewHeightBasedOnChildren(listView); 

这样也不行。只能说成功了一半。如果只写个这,还是不行哒。就算1,2两种方法都用也是不行滴。

那么。重点来了。怎么玩呢?

<!----------------------------------------------------------------------------------------!>

<!----------------------------------------------------------------------------------------!>

<!----------------------------------------------------------------------------------------!>

<!----------------------------------------------------------------------------------------!>

笔者成功的方法步骤

  第一步,更改自己的item的布局为LinerLayout。注意,高度给确定的值。

  第二步,重写一个ListView(大招来了)。这个是很重要的,原生的listview不得行。重写内容如下:

public class CustomListView(这个类名随意写) extends ListView{


public CustomListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public CustomListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

public CustomListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, 
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

 第三步,在你含有listview的xml文件里。不要ListVeiw。改成你自己的类。大概格式是: <com.tools.CustomListView/>
 第四步,在主activity里,把你的ListView 都改成你自己重写的那个,记得导入包。。

 总结,这个方法是目前我掌握的最终解决办法了。至于重新计算item高度的那种,我没有成功。。不过我觉得,每次进入都要重新计算的话,会比较慢吧。总的来说,最重要的就是新写一个ListView,用自己写的。就ok了。这种方法,也还是比较简单的。

 (注:)这个方法是用于不点击的listview,因为我这里是只做显示了。以后如果碰到要显示的了,我再想吧。(说不定这个方法都通用呢?哈哈哈)欢迎大家交流。。

1 0