Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为动态内容保留滚动视图滚动位置_Android_Scrollview - Fatal编程技术网

Android 为动态内容保留滚动视图滚动位置

Android 为动态内容保留滚动视图滚动位置,android,scrollview,Android,Scrollview,我想归档的内容可以用一张图片来最好地解释 灰色框表示屏幕,蓝色框表示元信息,白色圆形框表示搜索视图,红色框表示搜索返回的项目 到目前为止,我已经做到了这一点,但是当用户搜索某个内容时,问题就出现了,并且这些项目超出了屏幕(1)。之后,用户向下滚动,因此元信息在屏幕(2)之外。用户现在仍然可以输入新的搜索查询,从而更改项目。但是,当新查询返回的项目太少而无法填充屏幕的其余部分(3)时,ScrollView将“跳回”顶部(不在图像中,不需要)。我想要的是SearchView保持不变的行为(3)。在

我想归档的内容可以用一张图片来最好地解释

灰色框表示屏幕,蓝色框表示元信息,白色圆形框表示搜索视图,红色框表示搜索返回的项目

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

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

编辑滚动视图是视图的根

编辑基本布局结构

<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>


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

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

试用

ScrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
而且,当您的搜索框被使用时,您可以通过编程方式执行以下操作

searchBox.requestFocus()
要获得更多的控制,您也可以尝试MotionListener。如果您还可以添加代码,我可以更具体一些。 别忘了检查滚动查看方法


仅供参考,玩focus会给你带来很多有趣的场景和动画/动作:)

也许我以后会有时间回来讨论这个问题,并更新我认为我将如何解决这个问题的更多细节。但就目前而言,我只想发布一些我有时间看的东西

我相信这将通过下面的滚动视图和上面的视图来实现。一个在元数据和searchview上,另一个在模拟列表中要滚动的元素上


滚动下面的模拟列表时,必须执行检查。根据scrollview上的侦听器,通过下面scrollview中的操作来减小上面视图的大小;限制searchview的大小。然后,当满足以下滚动视图已到达末尾的条件时,放大上方视图以填充空间。

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

我将搜索结果包装成线性布局,并使用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>
这将给出问题图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);
        }
    }
});

就是这样。

因为我不熟悉通常是如何实现的,也许您可以提供一些片段,说明目前为止您使用哪些类来实现这种滚动行为。仔细考虑这个过程并试图找到一种方法。您是否尝试过使用scrollTo()将ScrollView向下移动?不确定它是你应该使用的,但它可能会有所帮助。它只是一个简单的滚动视图。没什么特别的。是的,我试过了,没用。问题是ScrollView会收缩到内容。这激发了将fillViewport与scroll to结合使用的想法。@Mene有一个内置的行为来实现(2)将搜索组件保持在顶部?或者你有一些代码管理和保持它在屏幕外,同时保持搜索栏在顶部?我添加了我的布局大纲。但老实说,我看不出这和焦点有什么关系。。如果在linearlayout(列表视图)下面添加了另一个布局会怎么样。。填充滚动视图布局的剩余部分。是的,这就是我现在正在实施的解决方案。这也是我想到的第一个解决这个问题的方法,但如果你记住这张图,它实际上相当复杂。我希望有更直截了当的东西,特别是因为它是在Google+上完成的。
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);
        }
    }
});