背景:需要在博文列表中加入评论列表,即ListView中嵌套ListView,如下图所示:(已经调整好的效果图)
之前使用的如下代码进行填充(在子listview被加载后重新计算它所有item的高度,重新展示)
// 填充评论信息 BwCommentAdapter adapter_bwcomment = new BwCommentAdapter(context, BwAdapter.this); adapter_bwcomment.clear(); holder.comment_listview.setAdapter(adapter_bwcomment); holder.rl_comment.setVisibility(View.GONE); if (po.getCommentLst() != null && po.getCommentLst().size() > 0) { holder.rl_comment.setVisibility(View.VISIBLE); adapter_bwcomment.addItems(po.getCommentLst(), true); AppUtil.fillTotalHeightofListView(holder.comment_listview); }
public static void fillTotalHeightofListView(ListView listView) { ListAdapter mAdapter = listView.getAdapter(); if (mAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, listView); mView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); // mView.measure(0, 0); totalHeight += mView.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (mAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); }
在第一个listview的item里嵌套如下list
<ListView android:id="@+id/comment_listview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_centerVertical="true" android:background="@android:color/transparent" android:cacheColorHint="@color/transparent" android:divider="@color/transparent" android:dividerHeight="5dp" android:listSelector="@color/transparent" android:scrollbarStyle="outsideOverlay" />
子list的item 如下:(必须使用LinearLayout ,否则计算不出正常的子item高度)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_r" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:descendantFocusability="blocksDescendants" android:background="@android:color/transparent" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/bw_tv_username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="mojianpo" android:textColor="@color/praise_bg" android:textSize="@dimen/normalSize" /> <TextView android:id="@+id/bw_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_toRightOf="@id/bw_tv_username" android:layout_toLeftOf="@id/tv_delete" android:text="评论内容" android:singleLine="false" android:textColor="@color/bw_666666" android:textSize="@dimen/normalSize" /> <TextView android:id="@+id/tv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="删除" android:textColor="@color/bw_ff5a00" android:textSize="@dimen/normalSize" /> </RelativeLayout> </LinearLayout>
运行之后,如果是单行文字没有问题,但是当文字太多,换行了,显示就不行了,换行的子item通过上
执行AppUtil.fillTotalHeightofListView(holder.comment_listview); 无法显示正常。
最好的办法如下,完美解决嵌套问题以及换行问题,使用自定义的listview,重写onMeasure方法,如下:
MeasureListView.java
/** * */ package my.views; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; public class MeasureListView extends ListView { public MeasureListView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MeasureListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public MeasureListView(Context context) { super(context); init(); } private void init() { this.setCacheColorHint(Color.TRANSPARENT); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
子listview变成如下:
<my.views.MeasureListView android:id="@+id/comment_listview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_centerVertical="true" android:background="@android:color/transparent" android:cacheColorHint="@color/transparent" android:divider="@color/transparent" android:dividerHeight="5dp" android:listSelector="@color/transparent" android:scrollbars="none" />运行之后,效果图就是第一张图片所示了。