【问题标题】:Keep ScrollView scroll position for dynamic content保持动态内容的 ScrollView 滚动位置
【发布时间】:2014-07-15 06:27:06
【问题描述】:

我想存档的东西可以用一张图片来解释

灰色框代表屏幕,蓝色框是元信息,白色圆角框是SearchView,红色框是搜索返回的项目。

到目前为止,我已经完成了这项工作,但是当用户搜索某些内容并且项目超出屏幕 (1) 时,就会出现问题。之后用户向下滚动,因此元信息位于屏幕之外 (2)。用户现在仍然可以输入新的搜索查询,从而更改项目。但是,当新查询返回的项目太少而无法填满屏幕的其余部分 (3) 时,ScrollView 将“跳”回顶部(不在图像中,不需要)。我想要的是 SearchView 保持不变的行为 (3)。一旦处于此状态,用户就可以滚动回顶部 (4)。如果她这样做了,她将无法向后滚动,而是会显示过度滚动指示器。

在 Google+ 应用中可以看到类似的行为。从开始屏幕转到您的个人资料(点击顶部的您的姓名)。您将看到三个寄存器(“关于我”、“帖子”、“照片”*)。例如,我那里没有照片,行为与描述的一样。

edit ScrollView 是 View 的根。

编辑基本布局结构

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="fill_parent"
  android:overScrollMode="always"
  android:fillViewport="true">

  <LinearLayout
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
      <View /> <!-- Meta info -->
      <SearchView />
      <View /> <!-- Item representing search result -->
      <View /> <!-- Item representing search result -->
      <View /> <!-- Item representing search result -->
      <View /> <!-- Item representing search result -->
      <View /> <!-- Item representing search result -->
  </LinearLayout>
</ScrollView>

*) 假定翻译自德语应用程序。

【问题讨论】:

  • 由于我通常不熟悉这是如何完成的,也许您可​​以提供一些 sn-ps,说明哪些类正在用于实现您迄今为止工作的这种滚动行为。思考这个过程并试图找到一种方法。
  • 您是否尝试过使用 scrollTo() 将 ScrollView 向下移动?不确定它是否应该使用,但它可能会有所帮助。
  • 这只是一个简单的 ScrollView 围绕其他所有内容。没什么特别的。
  • 是的,我试过scrollTo,它不起作用。问题是 ScrollView 缩小到内容。这激发了将 fillViewport 与滚动到一起使用的想法。
  • @Mene 有内置的行为来实现(2)您将搜索组件保持在顶部的位置?或者您有一些代码管理并保持在屏幕外,同时将搜索栏保持在顶部?

标签: android scrollview


【解决方案1】:

由于 android sdk 中似乎没有标准解决方案,也没有任何公共代码这样做,所以我修改了自己的解决方案。这是我的工作解决方案:

我将搜索结果包装在一个 LinearLayout 中,并使用 minimumHeight 来归档所需的行为。这样,当项目被添加到列表中时,我不需要摆弄测量值。

<LinearLayout
  android:id="@+id/scroll_placeholder"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  >
  <View /> <!-- result -->
  <View /> <!-- result -->
  <View /> <!-- result -->
</LinearLayout>

搜索结果是异步检索的,因此我清除列表并在触发新搜索时启动搜索指示器。此时我还将最小高度设置为itemList 的可见矩形的大小。请注意,itemList 不是ScrollView,否则 ScrollView 中会有一个有问题的 ScrollView。它基本上是一个包含结果的 LinearLayout。

int scrollY = rootScrollView.getScrollY();
if (scrollY > 0) {
    final Rect visibleListViewRect = new Rect();
    placeholder.getGlobalVisibleRect(visibleListViewRect);
    placeholder.setMinimumHeight(visibleListViewRect.height());
} else {
    placeholder.setMinimumHeight(0);
}

这将给出问题的图像 3) 中所示的行为。

为了在用户向上滚动后禁用向下滚动(图 4),我添加了一个 ScrollChangedListener:

placeholder.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
    @Override
    public void onScrollChanged() {
        int scrollY = placeholder.getScrollY();
        if (scrollY > 0) {
            final Rect visibleListViewRect = new Rect();
            placeholder.getGlobalVisibleRect(visibleListViewRect);
            placeholder.setMinimumHeight(visibleListViewRect.height());
        } else {
            placeholder.setMinimumHeight(0);
        }
    }
});

就是这样。

【讨论】:

    【解决方案2】:

    因为您没有提到任何代码。我只能向您推荐可能的解决方案。我遇到过类似的问题。您面临的问题是由于子布局的焦点。最有效的解决方案是控制这个焦点.

    尝试使用

    ScrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
    

    当你的搜索框被使用时,你可以通过编程来做

    searchBox.requestFocus()
    

    要获得更多控制,您还可以尝试 MotionListener。如果您还可以添加代码,我可以更具体。 并且不要忘记检查滚动视图方法http://developer.android.com/reference/android/widget/ScrollView.html

    仅供参考,专注游戏也会给你很多有趣的场景和动画/动作:)

    【讨论】:

    • 我添加了我的布局大纲。但老实说,我看不出这与焦点有什么关系。
    • 好的.. 如果你在线性布局(列表视图)下面添加另一个布局.. 填充滚动视图布局的剩余部分。
    • 是的,这就是我现在正在实施的解决方案。这也是我想到的第一种解决方法,但如果你牢记图 4),它实际上非常复杂。我希望有更直接的东西,特别是因为它是在 Google+ 中完成的。
    【解决方案3】:

    也许我稍后有时间再讨论这个问题,并更新我认为我将如何解决这个问题的更多细节。但至于现在,我只会发布一些我有时间的东西。

    我相信这可以通过下面的滚动视图和上面的视图来完成。一个在元数据和搜索视图上,另一个在您想要在模拟列表中滚动的元素上。

    当您滚动下面的模拟列表时,必须进行检查。根据滚动视图上的侦听器,通过下面滚动视图中的操作来减小上面视图的大小;到搜索视图大小的限制。然后当满足下面的scrollview已经到尽头的条件时,放大上面的view来填满空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多