ListView嵌套ListView,TextView有多行文本显示不全不问题

这是在网上找到的相关的解决方法,记录下来,方便以后查看。

关于ListView嵌套ListView,在网上找到的解决方法是调用自定义的方法动态计算listview的高度:

public void setListViewHeightBasedOnChildren(ListView listView) {     
        ListAdapter listAdapter = listView.getAdapter();     
        if (listAdapter == null) {     
            return;     
        }     
     
        int totalHeight = 0;     
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {     
            // listAdapter.getCount()返回数据项的数目     
            View listItem = listAdapter.getView(i, null, listView);     
            // 计算子项View 的宽高     
            listItem.measure(0, 0);      
            // 统计所有子项的总高度     
            totalHeight += listItem.getMeasuredHeight();      
        }     
     
        ViewGroup.LayoutParams params = listView.getLayoutParams();     
        params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));     
        // listView.getDividerHeight()获取子项间分隔符占用的高度     
        // params.height最后得到整个ListView完整显示需要的高度     
        listView.setLayoutParams(params);     
    }     

一开始一直使用这个方法,但是后来发现子listview的TextView显示多行文本时,计算就不准确了,在网上找到了其他的解决方法:

(1)

在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);  
    }  

测试了一下,发现这个方法是可行的。

(2)重写TextView的onMeature方法:(参考链接:点击打开链接

@Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  
        Layout layout = getLayout();  
        if (layout != null) {  
            int height = (int)FloatMath.ceil(getMaxLineHeight(this.getText().toString()))  
                    + getCompoundPaddingTop() + getCompoundPaddingBottom();  
            int width = getMeasuredWidth();              
            setMeasuredDimension(width, height);  
        }  
    }  
  
    private float getMaxLineHeight(String str) {  
        float height = 0.0f;  
        float screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();  
        float paddingLeft = ((LinearLayout)this.getParent()).getPaddingLeft();  
        float paddingReft = ((LinearLayout)this.getParent()).getPaddingRight();  
//这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,这个是拿TextView父控件的Padding的,为了更准确的算出换行  
 int line = (int) Math.ceil( (this.getPaint().measureText(str)/(screenW-paddingLeft-paddingReft))); height = (this.getPaint().getFontMetrics().descent-this.getPaint().getFontMetrics().ascent)*line; return height;}  
这个方法没有测试,先记录下来,以后再看看。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值