背景:需要在博文列表中加入评论列表,即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"
/>
运行之后,效果图就是第一张图片所示了。