如何在ListView中嵌套ListView,显示完全

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

猜你喜欢

转载自zhousheng193.iteye.com/blog/2223096