ListView layout_width match_parent和fill_parent在TableRow中不起作用

时间:2014-06-18 11:24:01

标签: android android-listview

我正在使用TableLayout,而某些TableRow元素内部有ListView。直到我在ListView中加载数据TableRow中的所有项目都正常工作。在ListViews layout_width match_parent加载数据时,fill_parent停止工作。

注意:在这个问题中,我问的是layout_width问题。我的layout_height效果很好,我也没有scrolling问题。

以下是我的布局的XML。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" >

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TableRow
            android:id="@+id/tr_lbl_topSongs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/app_orange"
            android:padding="5dp" >

            <TextView
                android:id="@+id/tv_lbl_topSongs"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Top Songs"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/app_white" />
        </TableRow>

        <TableRow
            android:id="@+id/tr_content_topSongs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ListView
                android:id="@+id/lv_topSongs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </ListView>
        </TableRow>

        <TableRow
            android:id="@+id/tr_viewMore_topSongs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center_vertical"
            android:background="@color/app_offwhite"
            android:gravity="center_horizontal|center_vertical"
            android:padding="5dp" >

            <TextView
                android:id="@+id/tv_viewMore_topSongs"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="View More"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/app_gray" />
        </TableRow>

        <TableRow
            android:id="@+id/tr_lbl_topVideos"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/app_orange"
            android:padding="5dp" >

            <TextView
                android:id="@+id/tv_lbl_topVideos"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Top Videos"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/app_white" />
        </TableRow>

        <TableRow
            android:id="@+id/tr_content_topVideos"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ListView
                android:id="@+id/lv_topVideos"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </ListView>
        </TableRow>

        <TableRow
            android:id="@+id/tr_viewMore_topVideos"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center_vertical"
            android:background="@color/app_offwhite"
            android:gravity="center_horizontal|center_vertical"
            android:padding="5dp" >

            <TextView
                android:id="@+id/tv_viewMore_topVideos"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="View More"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/app_gray" />
        </TableRow>

        <TableRow
            android:id="@+id/tr_lbl_topRingtones"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/app_orange"
            android:padding="5dp" >

            <TextView
                android:id="@+id/tv_lbl_topRingtones"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Top Ringtones"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/app_white" />
        </TableRow>

        <TableRow
            android:id="@+id/tr_content_topRingtones"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ListView
                android:id="@+id/lv_topRingtones"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </ListView>
        </TableRow>

        <TableRow
            android:id="@+id/tr_viewMore_topRingtones"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal|center_vertical"
            android:background="@color/app_offwhite"
            android:gravity="center_horizontal|center_vertical"
            android:padding="5dp" >

            <TextView
                android:id="@+id/tv_viewMore_topRingtones"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="View More"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="@color/app_gray" />
        </TableRow>
    </TableLayout>

</ScrollView>

更新:

我已经设法在ScrollView中使用ListView并使用以下代码。 我注册了TouchListner

lv_topSongs = (ListView) rootView.findViewById(R.id.lv_topSongs);
lv_topSongs.setOnTouchListener(this);

My TouchListner,我将触摸事件传递给ScrollView,并在ListView上禁用Touch。

@Override
public boolean onTouch(View v, MotionEvent event) {
    v.getParent().requestDisallowInterceptTouchEvent(true);
    mScrollView.onTouchEvent(event);
    return false;
}

我在ListView中使用以下代码加载数据后设置高度。

setListViewHeightBasedOnChildren(lv_topSongs);

我的setListViewHeightBasedOnChildren功能

/**** Method for Setting the Height of the ListView dynamically.
     **** Hack to fix the issue of not showing all the items of the ListView
     **** when placed inside a ScrollView  ****/
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null)
            return;

        int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
        int totalHeight = 0;
        View view = null;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            view = listAdapter.getView(i, view, listView);
            if (i == 0)
                view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));

            view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            totalHeight += view.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        params.width = LayoutParams.MATCH_PARENT;
        listView.setLayoutParams(params);
        listView.requestLayout();

    }

截图

enter image description here

2 个答案:

答案 0 :(得分:1)

我通过为ListView android:layout_weight="1"分配权重来解决此问题。

仍然无法理解为什么我必须分配重量,即使TableRow中只有一个项目,但这解决了我的问题。

答案 1 :(得分:0)

如果您希望列表填充等于表格行的高度,则必须为表格行提供一些固定高度。 试试吧。