【问题标题】:Hiding the Header view in ListView在 ListView 中隐藏 Header 视图
【发布时间】:2011-10-13 08:02:30
【问题描述】:

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

有没有办法隐藏它,只有当我们滚动到它时才显示它?我一直在尝试很多东西,但我想不出一个好的和简单的方法来做到这一点。

谢谢

【问题讨论】:

  • 我遇到了与 PullToRefresh 功能相同的问题,您找到解决方案了吗?谢谢
  • 我已经设法使某些东西起作用,但它非常不稳定。当我找到一些时间时,我将完成该组件并将其发布在我的博客上。 www.udinic.com。您可以关注它,或者只是偶尔访问此主题以了解是否有更新。

标签: android listview header


【解决方案1】:

这是一个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);

【讨论】:

  • 开箱即用的唯一方法,也在 Johan Nilsson 的 PullToRefreshListView 库中!
  • 又坏了。这是新链接:blog.pivotal.io/labs/labs/…
【解决方案2】:

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

如果没有,您能否发布一些代码来展示您目前拥有的内容?

编辑:

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

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

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

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

编辑 #2:

我查看了 PullToRefresh 自定义 ListView,您想要做的可能是可能的,但不一定容易。请允许我解释一下。

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

setSelection(1);

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

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

添加的填充量由源代码第 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 设置为标题,并将原始的拉动刷新标题添加到该 Frame 布局。然后,当我拖动列表时,我在 Frame Layout 的 LayoutParameters 中编辑了高度,以像最初的填充一样增长和缩小。它有点工作,但最终会强制关闭,我还没有弄清楚为什么。

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

【讨论】:

  • 感谢您的回复。您建议的方法是让 drawable 在过度滚动时替换橙色线,但您不能添加自己的视图。
  • 我试过了,它并没有取代我的橙色线条,但它也没有我希望的行为。我已经编辑了我的答案。
  • 这个我已经试过了,但是它没有处理列表短,不能滚动的情况。在这种情况下,他们只需放置一个始终可见的“点击刷新”标题。
  • 经过各种修补,我有了一些发现。请参阅我的第二次编辑。
  • 感谢您对此事的研究。最近几天我一直在研究这个问题,并且让这个东西工作了!我将进一步完善我的代码并报告。
【解决方案3】:

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

基于隐藏标题视图文章:
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。将最顶层的 RelativeLayout 包裹在 LinearLayout 中,然后再次将 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 标题应该完全不占用空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多