ListViewはListViewをネストし、TextViewは複数行のテキストが表示されても問題ありません.
2887 ワード
これはネット上で見つけた関連解決方法で、記録して、後で調べるのに便利です.
ListViewネストListViewについては、カスタムメソッドを呼び出してlistviewの高さを動的に計算する方法がネット上で見つかっています.
最初はずっとこの方法を使っていましたが、後でサブlistviewのTextViewに複数行のテキストが表示されていることに気づき、計算が不正確になり、ネット上で他の解決策が見つかりました.
(1)
listviewでonMeasureメソッドを実装するには、次の手順に従います.
テストしてみると、この方法は実行可能であることが分かった.
(2)TextViewのonMetureを書き換える方法:(リンク参照:クリックしてリンクを開く)
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;}
この方法はテストされていません.まず記録してから見てください.