ListViewはListViewをネストし、TextViewは複数行のテキストが表示されても問題ありません.

2887 ワード

これはネット上で見つけた関連解決方法で、記録して、後で調べるのに便利です.
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のonMetureを書き換える方法:(リンク参照:クリックしてリンクを開く)
@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;}  
この方法はテストされていません.まず記録してから見てください.