1

我的 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 会正确更新自身。但是在我添加了三四个新项目之后,containingPanel 拒绝自我更新,并且新项目被混合掉了。

4

3 回答 3

3

试试这个功能。我想,它可能会对你有所帮助。该函数用于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();
    }
于 2012-08-15T09:40:36.470 回答
2

(您可以添加 a ListViewinside aScrollView但并非没有一点工作(因为它们都是 Scrollable 组件 - 操作系统如何知道您要滚动哪个组件?)。您需要isScrollContainer="false"在 ListView 上添加。)

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_contents"
    android:isScrollContainer="false"/>

a 的全部意义ListView在于它具有由页面布局决定的设定高度。只有当它的孩子的组合高度超过显示它所需的区域时,它才会变得可滚动。

听起来您真正想要的是更类似于由适配器支持的 LinearLayout 的东西,网络上有几种实现,或者您可以创建自己的。

ListView但是,您可以通过将 ListView的高度设置为: 以编程方式动态调整您的大小,从而将 ListView 破解为这种行为listCount * itemHeight。这将具有持续扩展您的 ListView 的效果。

您可能会发现,随着您开发 UI 设计,您将不再需要这样的组件。

于 2012-08-15T08:15:05.593 回答
0

如果您的列表视图是默认大小,则可能无法将它们放入布局中。您可以尝试将列表视图包装在滚动视图中,然后您可以滚动浏览它们。

于 2012-08-14T15:09:30.903 回答