我的UI中有许多垂直堆叠的面板。每个面板都包含一个ListView。根据用户交互,ListView中的项目数量会更新。
我的问题是,如果我增加ListView中显示的项目数,则包含的面板将不会展开以显示它们。相反,我的ListView只是被淡化为黑色。我以编程方式创建每个堆叠面板 - 这是创建函数的主体:
LinearLayout containingPanel = new LinearLayout(TestActivity.this);
containingPanel.setOrientation(LinearLayout.VERTICAL);
// create title
TextView titleText = new TextView(TestActivity.this);
titleText.setText("a title");
titleText.setGravity(Gravity.CENTER);
titleText.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
// create dynamic list view of costs
ListView dynamicContentListView = new ListView(TestActivity.this);
dynamicContentListView.setAdapter(new MyDynamicAdapter());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
params.weight = 1;
dynamicContentListView.setLayoutParams(params);
// build up GUI
containingPanel.addView(titleText);
containingPanel.addView(dynamicContentListView);
return containingPanel;
我认为在ListView上设置权重应该足够了,但事实并非如此。所有GUI更新都运行正常 - 新项目会自动添加到支持适配器的数据中,并且ListView会自动更新。但是在我添加了三个或四个新项目之后,containsPanel拒绝更新自己并且新项目被混合出来。
答案 0 :(得分:4)
尝试此功能。我想,它可能对你有帮助。该函数用于根据子项设置ListView
的高度。
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
答案 1 :(得分:2)
(您可以在ListView
内添加ScrollView
,但不是没有一点工作(因为它们都是可滚动的组件 - 操作系统将如何知道您要尝试滚动哪一个?)。您需要在ListView上添加isScrollContainer="false"
。)
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_contents"
android:isScrollContainer="false"/>
ListView
的整个点是它具有由页面布局决定的设定高度。只有当孩子的组合高度超过显示它所需的区域时,它才会变得可滚动。
听起来你真正想要的东西更类似于一个由适配器支持的LinearLayout,网上有几个实现,或者你可以创建自己的。
但是,您可以通过将其高度设置为ListView
来以编程方式动态调整listCount * itemHeight
,从而将ListView破解为此行为。这样可以持续扩展ListView。
您可能会发现,在开发UI设计时,您将不再需要这样的组件。
答案 2 :(得分:0)
如果您的列表视图是默认大小,则可能无法使它们适合布局。您可以尝试将listview包装在滚动视图中,然后可以滚动它们。