解决ListView嵌套ListView或者ScrollView嵌套ListView出现的问题

这几天正在学习有关嵌套的知识,其中出现过嵌套后ListView只显示一行数据等,高度不准

用两种简单的方法即可解决:

       一: 在listView.setAdapter() 后 调用Utility.setListViewHeightBaseOnChildren(listView);

         

public class Utility {
    public static void setListViewHeightBaseOnChildren(ListView listView){
        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);
            listItem.measure(0,0);
            totalHeight+=listItem.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        //最后得到整个ListView完整显示需要的高度
        params.height = totalHeight+(listView.getDividerHeight()*(listAdapter.getCount()-1));
        listView.setLayoutParams(params);
    }


}
ok

   二:自定义ListView, 重写一下onMeasure()方法,通知父布局高度即可

 

public class ExpandListView extends ListView {
    public ExpandListView(Context context) {
        super(context);
        setBackgroundColor(Color.argb(100, 0, 55, 55));
    }

    public ExpandListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ExpandListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 这里的widthMeasureSpec和heightMeasureSpec就是ScrollView给的建议,
     * 告诉ListView你想要多高都行,但是ListView耍贱不领情。
     * 所以我们只能伸出我们的上帝之手,手动把heightMeasureSpe改为At_MOST模式,
     * 并把size改为Integer.MAX_VALUE >> 2。
     * <p>
     * Integer.MAX_VALUE >> 2表示父View允许的最大高度,
     * measureHeightOfChildren()中最后会判断计算出的高跟这个值做比较,
     * 要是计算出的高大于最大限定高,则会返回上一次的高或者最大限定高。我们设为Integer.MAX_VALUE >> 2,
     * 理论上计算出来的高不会超过这个限定。
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

欢迎纠错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值