简单函数解决ListView和ScrollView冲突问题

来源:互联网 发布:灰度图像轮廓提取算法 编辑:程序博客网 时间:2024/06/03 05:09

  最近开发中遇到一个问题,就是ScrollView和ListView不能并存的问题。

  有一个很长的页面(超出了手机的屏幕),上面有许多的内容。一般情况下我们会将这些控件放置在ScrollView中,当超出屏幕范围时,ScrollView会自动为我们加上垂直滚动条。但是ListView控件本身也会根据屏幕大小自动添加垂直滚动条,所以两者在一起的时候会造成冲突。

  一般表现为ListView无法正常展示全部数据,只能看到一到两个条目,如下图所示。

  官方API也建议不要将两者一起使用,但是我们确实有这样的需求怎么办呢。

  仔细观察上图可以发现ListView 没有展示完全,原因是ScrollView没能正确计算出ListView所在布局的高度。我们可以手动计算出ListView的高度,然后改变它所在布局的高度。这样ScrollView就能正常显示了。

  函数代码如下:

public void setListViewHeightBasedOnChildren(ListView listView) {  

    ListAdapter listAdapter = listView.getAdapter();   //取得listview绑定的适配器

    if (listAdapter == null) {  

        return;  

    }  

 

    int totalHeight = 0;  

    for (int i = 0; i < listAdapter.getCount(); i++) {  

        View listItem = listAdapter.getView(i, null, listView);  

        listItem.measure(0, 0);  //测量

        totalHeight += listItem.getMeasuredHeight();  //将所有子项的高度进行叠加

    }  

 

    ViewGroup.LayoutParams params = listView.getLayoutParams();  //取得listview所在布局的参数
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount()));  

    listView.setLayoutParams(params); //改变listview所在布局的参数

}

 

  通过测试非常简单有效,基本达到预期效果,如图:

 

  不足之处:由于手动设置了ListView所在布局的高度,当ListView高度发生变化时,如删除了一条数据。ScrollView不会自动改变高度,控件占据的位置依然存在,如图。

 

  

   接下来我们将介绍另外一种更为好用的解决方法,参见:

  自定义控件解决GridView和ScrollView冲突


   参考资料:Stack Overflow上的一篇帖子


  原文链接:http://www.67tgb.com/?p=470 

  欢迎访问:望月听涛

  

原创粉丝点击