1. 程式人生 > >ListView巢狀ListView,TextView有多行文字顯示不全不問題

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;}  
這個方法沒有測試,先記錄下來,以後再看看。