我正在使用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();
}
截图
答案 0 :(得分:1)
我通过为ListView
android:layout_weight="1"
分配权重来解决此问题。
仍然无法理解为什么我必须分配重量,即使TableRow
中只有一个项目,但这解决了我的问题。
答案 1 :(得分:0)
如果您希望列表填充等于表格行的高度,则必须为表格行提供一些固定高度。 试试吧。