ListView嵌套ScrollView后,设置dividerHeight属性后高度计算

当我们需要在listView外层嵌套ScrollView,这样两个scroll滚动效果会产生相互影响,为了避免这个,我们通常是禁止listView滚动,

把ListView总高度计算出来,完全显示。

计算listView的总高度只需要自定义一个mylistView继承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);

    }

但是当listView设置了dividerHeight属性之后上面的方法就失效了,因为上面的方法 没有加上每个Item之间的间隔dividerHeight。

我们怎么办呢,通过在网上的搜索,发现有其他网友分享,可以先加载出listView的数据,然后通过for循环计算每个item的高度,再加和

得到我们想要的listView的总高度。

代码如下:

public static void setListViewHeightBasedOnChildren(ListView listView) {
        //获取ListView对应的Adapter
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            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()+listView.getDividerHeight()/2; //统计所有子项+dividerheight的总高度
        }

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

注意:1、setListViewHeiBasedOnChildren(listView),在数据添加之后使用

if (addressResult != null && addressResult.size() >= 0) {
                        addressadapter = new AddressItemAdapter(getApplicationContext(), addressResult);
                        addressadapter.addressListener(AddressActivity.this);
                        addressListView.setAdapter(addressadapter);
                        setListViewHeightBasedOnChildren(addressListView);
             }

2、ListView的Item的根目录必须是LinearLayout

3、记得addressadapter.notifyDataSetChanged();刷新adapter更新之后要调用

时间: 2024-09-29 03:28:07

ListView嵌套ScrollView后,设置dividerHeight属性后高度计算的相关文章

关于iso不兼容input框设置readonly属性后

苹果设备,对于输入框设置了readonly属性以后,还是会有光标显示.可以在input\textarea设置了readonly属性后,在script中增加:$('input[readonly]').on('focus', function() {$(this).trigger('blur');});就不在显示光标了.动态生成元素的点击事件$(document).on("click",'.class1,.class2,...',function(){})或$('.class1,.clas

元素设置float属性后,其后面的元素的位置问题

分两种情况: .content{ width:350px; height:150px; color:#fff; } .content1,.content2{ background-color: #00f; } .content2{ margin-top:10px; } .one{ background-color:#f00; float: left; } .two{ background-color: #3dfeca; } .content1 .one, .content2 .one{ heig

Html 使用技巧 -- 设置display属性可以使div隐藏后释放占用的页面空间

     div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visibility: none;" document.getElementById("typediv1").style.visibility="hidden";//隐藏 document.getElementById("typediv1").style.visibility="visible";//显

CSS关于子元素设置了float属性后父元素高度为0的解释和解决方法

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html lang="en"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8&q

浅谈android中的ListView合集系列之解决ScrollView和ListView嵌套冲突(一)

相信大家都已经可以熟练使用ListView和GridView,大神们估计都在使用RecyclerView了.如果还在使用ListView,你肯定有这样的一个深刻的感受,那就是在做一个APP的时候使用ListView和GridView很频繁,并且经常会遇到一个页面中除了有ListView或GridView可能还有一些其他的内容,但是可能内容很多,你第一时间就会想到让它整体滑动即可,那就是在总的布局外面包裹一个ScrollView.也就是出现了ScrollView中嵌套一个ListView的场景,或

Android ListView,GridView,ScrollView,ProgressBar,SeekBar,RelativeLayout,EditText常用属性

ListView的一些特殊属性: 1.ListView的XML属性 [java] view plaincopy android:divider//在列表条目之间显示的drawable或color android:dividerHeight//用来指定divider的高度 android:entries//构成ListView的数组资源的引用.对于某些固定的资源,这个属性提供了比在程序中添加资源更加简便的方式 android:footerDividersEnabled//当设为false时,Lis

Android仿小米商城商品详情界面UI,ScrollView嵌套ScrollView/WebView/ListView

最近公司没事,研究了下多嵌套滚动组件的事件分发,虽然以前也接触过,但都是拿网上的用,也是特别简单的,正好朋友也需要,就研究了下 这个Demo也不是很完善,放上来也是让各位大牛给指点一下,优化优化 使用情景: 小米商城商品详情界面,界面看似ScrollView,但当正常滚动到底部时,提示继续上拉显示更多详情,上拉后直接滚动到第二屏,第二屏是个ViewPager,ViewPager里面的各个pager有的是WebView有的是ListView,有的是ScrollView,一开始想想就特别头晕,后来理

?ScrollView、ListView嵌套

1.手动设置ListView高度 经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动代码设置ListView高度的方法就诞生了. /** * 动态设置ListView的高度 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { if(listView == null)

在Fragment中嵌套使用viewpagerindicator切换Fragment返回后出现空白页与FragmentPagerAdapter页面预加载的解决方案

1. 在Fragment中嵌套使用viewpagerindicator切换Fragment返回后出现空白页 先上代码: 1 mAdapter = new OrderAdapter(getChildFragmentManager()); 2 ViewPager pager = (ViewPager) v.findViewById(R.id.pager); 3 pager.setAdapter(mAdapter); 4 5 TabPageIndicator indicator = (TabPageI