在ListView中隐藏Header视图

Udi*_*nic 20 android listview header

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

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

谢谢

And*_*Dev 26

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

我们的想法是将您希望隐藏的内容放入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>
Run Code Online (Sandbox Code Playgroud)

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

spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

  • 这个链接好像坏了,你能不能更新一下? (2认同)

the*_*enp 7

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

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

编辑:

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

相反,您应该从其他人试图模仿的Twitter应用程序中查看"拉动刷新"机制.您可以从这个问题中查找答案.

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

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

编辑#2:

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

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

setSelection(1);
Run Code Online (Sandbox Code Playgroud)

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

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

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

if (mRefreshState == RELEASE_TO_REFRESH)
{
    //Some code that eventually adds padding to the header...
}
Run Code Online (Sandbox Code Playgroud)

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

if (true)
{
    //Some code that eventually adds padding to the header...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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