之前说listview的高度很好计算,ExpandableListiew也差不多
1.获取有多少个group,就是一级目录, 拿到group的item的高度×group数量*每两个之间的间距 这个间距一般都木有
然后将高度赋给ExpandableListView
发现直接ExpandableListView.setLayoutParams不行 好吧 那就改变一下 给ExpandableListView外面套一个LinearLayout
然后在代码中将高度赋给LinearLayout
中间用到的dp和dip的转换 在xml中100dp和代码中设置setHeight(100)是不一样的 代码中的数字是以dip为单位的 所以要转化
/**
* dp转换成dip
* @param context
* @param dpValue
* @return
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* dip转换成dp
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
测试 发现OK,BUG最后一项点击出不来子选项,其实已经出来了 只是高度固定死了 看不到而已,在一级目录点击事件中处理
//监听group事件 处理最后一项
expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
if(groupPosition==umfList.size()-1){
int h = DpDipConversionUtil.dip2px(mContext, 100); //每一个group的高度
params.height = h*umfList.size()+1; //总高度+1
qd.setLayoutParams(params);
}
return false;
}
});
测试后发现 我的理解是。 不用动态去算最后一项二级目录的高度 只要告诉它下面还有空位置 点击就会展开了 所以在高度后+1, 还有这个+1基本完全不影响界面的
1dip也就是一个像素点 根本看不出来 所以也不用怕 收回去这个linearlayout的高度不对
最后说一点 scrollview嵌套listview和ExpandableListView这种 很麻烦 最好不要这样设计 尽量避免这种情况的发生