在ListView中隐藏Header视图

我正在尝试将标题视图添加到我的列表中,并一直隐藏它,除非我们滚动到它(如拉动刷新机制)。 问题是:如果列表不够高,无法填满屏幕 – 标题视图显示在列表顶部。

有没有办法隐藏它,只有当我们滚动它时才能看到它? 我一直在尝试很多东西,但我无法find一个好的和简单的方法。

谢谢

这是一篇博客文章,描述了一种隐藏和显示标题视图的简单方法。

我们的想法是将您希望隐藏的内容放在包装它的LinearLayout中,并仅隐藏内容 。 这样,包装LinearLayout将在其内容被隐藏时崩溃,从而导致headerView在技术上仍然存在,但是0dip高。

注意:如果您尝试隐藏没有封闭布局的内容,则会在标题视图中留下不需要的空间。

带有表示内容的微调器的示例布局:

    

然后你可以隐藏微调器(内容),如下所示:

 spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE); 

您可以查看ListView.setOverscrollHeader()或ListView.setOverscrollFooter() 。 这是你正在寻找的行为吗?

如果没有,你能发布一些显示你目前为止的代码吗?

编辑:

好的,所以我查看了Overscrolling页眉/页脚,你说得对,我认为这根本不是你想要的。

相反,您应该从其他人试图模仿的Twitter应用程序中查看“拉动刷新”机制。 您可以查看此问题的答案。

最有希望的答案似乎是由Johan Nilson编写的自定义ListView,其代码可以在这里find:

https://github.com/johannilsson/android-pulltorefresh

编辑#2:

我看了一下PullToRefresh自定义ListView,你想做什么可能是可能的,虽然不一定容易。 请允许我解释一下。

PullToRefreshListView本质上只是一个利用标准ListViews中可选Header的hack。 您看到的隐藏的“Pull To Refresh”实际上只是ListView的标题。 显示列表时,执行以下行:

 setSelection(1); 

这会将列表滚动到列表中的第一个项目,有效地隐藏了标题。 当List足够短以完全显示在屏幕上时,不需要滚动,因此“点击刷新”按钮。

当“点击刷新”可见时,拉动刷新机制被禁用,但很容易解决这个问题。 拉动刷新效果是通过增加标题视图的顶部填充来实现的,这样看起来你正在拉下列表(当真正更准确地说标题正在推动列表的其余部分时)。

添加的填充量由源代码的第199行上的applyHeaderPadding()函数控制。 在该函数中,第220行的if语句仅在列表处于RELEASE_TO_REFRESH模式时应用填充:

 if (mRefreshState == RELEASE_TO_REFRESH) { //Some code that eventually adds padding to the header... } 

如果您消除此条件或将其更改为应用填充,无论您处于何种模式,即使列表很短且标题显示“点击刷新”,您也可以拖动刷新

 if (true) { //Some code that eventually adds padding to the header... } 

但是,这并不能完全创建您正在寻找的效果。 如果列表很短,您可以将其向下拖动以刷新,但仍会显示“点击刷新”标题。 现在的问题是“如何在拖动动作开始之前隐藏标题?” 这是一个很难解决的问题,有几个专门针对它的Stack Overflow问题 。

如果需要标题,则必须在为ListView设置适配器之前添加它,否则会出现各种错误。

我在这方面取得了一些成功,但我没有提出任何稳定的东西,因为我的解决方案是在已经被黑的PullToRefreshListView之上的一种令人讨厌的黑客攻击。 我将一个空的FrameLayout设置为标题,并将原始pull to刷新标题添加到该Frame Layout。 然后,当我拖动列表时,我在Frame Layout的LayoutParameters中编辑了高度,以便像填充最初一样增长和缩小。 它有点奏效,但最终会强行关闭,我还没弄明白为什么。

无论如何,如果我让它工作,我会发布代码,否则比我更聪明的人可能会根据我刚提供的信息提出解决方案。

这是当前PullToRefreshListView的解决方案(2011年11月4日更新):
https://github.com/johannilsson/android-pulltorefresh

基于Hiding Header Views文章:
http://pivotallabs.com/users/joe/blog/articles/1759-android-tidbits-6-22-2011-hiding-header-views

1)将pull_to_refresh_header.xml从库的res/layout复制到应用程序的res/layout

2)编辑应用程序的pull_to_refresh_header.xml 。 在LinearLayout中包装最顶层的RelativeLayout,然后再次将LinearLayout包装在RelativeLayout中。 为什么? 最顶层的布局必须是RelativeLayout,因为这是代码中的预期,第二级布局必须是LinearLayout,因为这是唯一与View.GONE折叠的布局。 第三级布局必须与原始顶级RelativeLayout(id除外)相同才能保留外观。

3)在顶部RelativeLayout(pull_to_refresh_header)上保留相同的id,给第二级LinearLayout一个你选择的id,给第三级RelativeLayout另一个id(例如pull_to_refresh_header2)。

4)将所有填充从最顶层的RelativeLayout移动到第二个RelativeLayout。

5)在您的代码中使用findViewById和您的LinearLayout id来设置View.GONE的可见性。 LinearLayout将崩溃,如果您将所有填充值适当地移动到内部RelativeLayout,则标头应该不占用空间。