在ListView中隐藏Header视图

时间:2011-07-26 11:11:22

标签: android listview header

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

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

由于

3 个答案:

答案 0 :(得分:26)

这是一个blog post,描述了一种隐藏和显示标题视图的简单方法。

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

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

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

<LinearLayout
      xmlns:a="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">
      <ProgressBar
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

然后你可以按如下方式隐藏微调器(内容):

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

答案 1 :(得分:7)

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

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

修改

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

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

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

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

编辑#2:

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

PullToRefreshListView本质上只是一个利用标准ListView中可选Header的黑客攻击。您看到的隐藏的“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 questions致力于它。

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

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

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

答案 2 :(得分:2)

以下是当前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)将库的res/layout中的pull_to_refresh_header.xml复制到您应用的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,则标题应该不占用任何空格。