36

我想为我的用户显示个人资料屏幕。

它必须具有三个视图(2Buttons和 a ImageView)和 aListView以显示该用户制作的内容。

但是,我不想ListView滚动。相反,我希望它尽可能大,并将我的所有视图放入 aScrollView中,因此前三个视图与ListView. 当然,这不会按预期工作。

我所有的三件物品都在一个LinearLayout. 我想让它们成为 中的第一项ListView,但这导致它们可以作为第一项选择,并且必须进行一些不需要的编码。

有没有一种简单的方法可以做到这一点,还是我必须坚持让布局成为我的 ListView 中的第一项?

4

7 回答 7

51

我为此找到了一个非常简单的解决方案。只需获取列表视图的适配器并在显示所有项目时计算其大小。优点是该解决方案也适用于 ScrollView。

例子:

public static void justifyListViewHeightBasedOnChildren (ListView listView) {

    ListAdapter adapter = listView.getAdapter();

    if (adapter == null) {
        return;
    }
    ViewGroup vg = listView;
    int totalHeight = 0;
    for (int i = 0; i < adapter.getCount(); i++) {
        View listItem = adapter.getView(i, null, vg);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams par = listView.getLayoutParams();
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
    listView.setLayoutParams(par);
    listView.requestLayout();
}

调用此函数传递您的 ListView 对象:

justifyListViewHeightBasedOnChildren(myListview);

上面显示的功能是对以下帖子的修改: 禁用列表视图中的滚动

请注意在将适配器设置为列表视图后调用此函数。如果适配器中条目的大小发生了变化,您也需要调用此函数。

于 2015-01-07T11:39:02.407 回答
13

你可以这样做

listView.setScrollContainer(false);

更多请查看

如何获得不可滚动的 ListView?

于 2012-08-31T10:02:00.327 回答
9

将它们作为第一个 Item 添加到 ListView 似乎是一个很好的解决方案。

要使视图不可选择,只需获取视图和.setClickable(false).

于 2012-08-31T10:20:07.860 回答
5

我会ViewListView. 给它设置一个View.OnTouchListener()true并通过在 的onTouch()方法中返回来消费事件View.OnTouchListener()

当您希望列表再次向后滚动时,请删除透明上设置的触摸侦听器View

于 2013-09-18T12:54:32.457 回答
4

如果您必须在列表视图中显示有限数量的项目并希望阻止列表视图滚动,那么您必须保持列表视图高度大于项目总高度。

例如,您要显示 3 个项目。(行高为 30)。然后项目总高度变为 3 x 30dp = 90dp,

所以现在你必须将列表视图高度设置为大于 90。例如:100dp。所以现在你的列表视图无论如何都不会滚动。

于 2013-10-07T11:30:27.223 回答
2

我认为最好的方法是将 2 个按钮和图像视图放在 LinearLayout (或任何适合您需要的布局)中,并使用 addHeaderView 方法将此布局添加为列表标题:

http://developer.android.com/reference/android/widget/ListView.html#addHeaderView(android.view.View )

于 2012-08-31T23:37:44.853 回答
1

使用以下说明:

name_lista.getLayoutParams (). height = new_size

new_size 是一个变量,您将根据列表中的元素数量进行计算,例如:

new_size = 100 * list_size;
于 2018-05-09T18:09:38.190 回答