ExpandableListView嵌套ListView导致ListView不能完全显示数据的问题

最近为了得到分组下拉效果,使用了ExpandableListView控件,由于要在子元素显示非常复杂的布局方式,所以子元素采用了Listview进行布局
因此得到了一个问题,就是无论ListView包含多少数据,最多只显示一行。这个问题困扰了我一天上网找了很多,都没有类似的问题,ORZ  。

但是幸运的发现了这个问题跟ScrollView嵌套ListView一样会造成无法完全显示数据的问题。当然解决方法也几乎一样。

原理是如果两个具有滑动属性的控件相互嵌套的话,被嵌套的控件的高度会按最开始绑定的高度计算。比如我在ExpandableListView 底下绑定了一个ListView控件,而这个被嵌套的控件给它设置的值是android:layout_height="wrap_content"   ,所以无论添加多少数据,始终只是显示一行。
为了能完整显示控件内容,继承BaseExpandableListAdapter类重写适配器,在getChildVIew()方法中重新计算高度并赋值给LayoutParams属性


这里参考了一个大神的博客,http://blog.csdn.net/yaya_soft/article/details/25796453 ,当然源码也是基本相同的,因为解决方法都一样嘛 (⊙o⊙) 




import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;



/**
 * 计算listview高度的问题
 * 如果两个具有滑动属性的控件相互嵌套的话,被嵌套的控件的高度会按最开始绑定的数据计算
 * 为了能完整显示控件内容,要重新计算高度并复制给LayoutParams属性
 * @package com.jian.adapter.ListViewParamsUtils
 * @author jian
 * @version V1.0
 */
public class ListViewParamsUtils {

	public static void setListViewHeightBasedOnChildren(ListView listView){
		
	// 获取ListView对应的Adapter  
        ListAdapter listAdapter = listView.getAdapter();  
        if (listAdapter == null) {  
            return;  
        }  
        //初始化高度
        int totalHeight = 0;  
        
        for (int i = 0; i < listAdapter.getCount(); i++) { 
            View listItem = listAdapter.getView(i, null, listView);  
            //计算子项View的宽高,注意listview所在的要是linearlayout布局
            listItem.measure(0, 0); 
            //统计所有子项的总高度  
            totalHeight += listItem.getMeasuredHeight(); 
        }  
  
        ViewGroup.LayoutParams params = listView.getLayoutParams();  
        
        /*
         * listView.getDividerHeight()获取子项间分隔符占用的高度,有多少项就乘以多少个减一
         * params.height最后得到整个ListView完整显示需要的高度
         * 最后将params.height设置为listview的高度
         */
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
        listView.setLayoutParams(params); 
        
	}
	
}


这里要注意的是获取控件高度的方法要用listItem.measure()方法,而不能用listItem.getHeight()。采用getHeight方法得到的总是0

因为在控件绘制的时候,根本不知道自己的大小,所以我们不能在onCreate或getView等创建控件的方法中使用getHeight,这样得到的总是0,绘制好了之后才可以使用该方法。还有一个问题我没尝试过,是在看其他人的博客中写道,listview控件必须在LinearLayout布局中才可以使用上述方法获得高度,因为只有LinearLayout重写了onMeasure方法,其他布局没有重写,如果是使用了其他布局会造成空指针异常,这里贴上另一篇参考的博客:http://blog.csdn.net/jackrex/article/details/12611681


最后附上成功运行的图片(纪念这个花了我一天的问题)

ExpandableListView嵌套ListView导致ListView不能完全显示数据的问题_第1张图片







你可能感兴趣的:(ExpandableListView嵌套ListView导致ListView不能完全显示数据的问题)