2012-08-31 49 views
27

我想为我的用户显示Profile屏幕。禁用ScrollView中包含的ListView的滚动

它必须有三个视图(2 ButtonsImageView)和ListView才能显示该用户所做的内容。我不希望ListView滚动。相反,我希望它能够像需要的那样大,并且将我的所有视图放在ScrollView之内,因此三个第一个视图与ListView一起滚动出来。当然,这并不是按照预期工作的。

我的三件物品都在LinearLayout之内。我想让它们成为ListView中的第一项,但这导致它们作为第一项被选择,并且不得不做一些不需要的编码。

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

+0

检查: http://stackoverflow.com/questions/4338185/how-to- get-a-non-scrollable-listview –

+0

是的,但是如果我使用LinearLayout而不是ListView,我不会收到OnItemSelected事件,这会导致更多不必要的编码。 – razielsarafan

+0

嗨检查链接,仔细阅读。在LinearLayout中使用listview。将ScrollContainer设置为false,并且可以将OnClickListener或OnTouchListener绑定到点击或触摸时将触发的视图 –

回答

6

它们添加到ListView控件作为第一个项目似乎是一个非常好的解决方案。

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

11

您可以通过

listView.setScrollContainer(false); 

更多的做到这一点请

How to get a non scrollable ListView?

+6

这不起作用,您提供的链接与您的答案相矛盾。 –

+1

@MattW我给出了这个答案的这个参考原因“不要把一个列表视图放在滚动视图中,它不起作用。如果你想要一个不滚动的项目列表,它被称为线性布局”。上面的代码将无法正常工作列表视图与滚动视图布局有问题。 –

+0

@SaifuddinSarker但如果我有动态数量的项目,我想在列表中显示不滚动? – Micer

5

我会在ListView的顶部添加一个View,带有不可见的背景。设置一个View.OnTouchListener()。并通过返回true,方法View.OnTouchListener()消耗事件。

当你想要列表再滚动回来,除去触摸监听器上的透明View

2

设置,如果你要在列表中显示视图中的项目数量有限,想从此滚动停止列表视图必须保持listview高度大于项目总高度。

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

所以现在您必须将listview高度设置为大于90.例如:100dp。所以现在你的listview不会在任何情况下滚动。

39

我发现了一个非常简单的解决方案。只需获取listview的适配器并在显示所有项目时计算其大小。 优点是这个解决方案也适用于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); 

上面显示的功能是一个后在modidication: Disable scrolling in listview

请注意,以在将适配器设置为列表视图后调用此函数。如果适配器中条目的大小已更改,则还需要调用此函数。

+1

给定方法的作品,但在这样做后,我的滚动达到最底部。整个页面被滚动下来。任何解决方案 –

+0

感谢您的好回答。解决了我的问题 –

-1

在XML文件中只是把

<listview android:nestedScrolling="false"/> 

它为我...

+0

我发现'android:nestedScrollingEnabled =“false”',但问题在于我的情况是“属性nestedScrollingEnabled只用于API级别21和更高”。 – Micer

相关问题