适配器更新后ListView内容被截止

时间:2012-08-14 14:58:45

标签: android listview dynamic

我的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拒绝更新自己并且新项目被混合出来。

3 个答案:

答案 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包装在滚动视图中,然后可以滚动它们。