保持ScrollView滚动位置以获取动态内容

时间:2014-07-14 17:23:38

标签: android scrollview

我想要存档的内容最好用图像来解释

enter image description here

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

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

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

编辑 ScrollView是视图的根目录。

修改基本布局结构

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

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

3 个答案:

答案 0 :(得分:0)

因为你没有提到任何代码。我可以向你介绍可能的解决方案。我遇到了类似的问题。你面临的问题是由于孩子布局的重点。最有效的解决方案是控制这个焦点

尝试使用

ScrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

以及使用searchBox时,您可以通过编程方式执行

searchBox.requestFocus()

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

FYI玩焦点会给你很多有趣的场景和动画/动作:)

答案 1 :(得分:0)

也许我稍后会有时间回到这里并更新其他详细信息,我认为我会解决这个问题。但就目前而言,我只会张贴一些我有时间的东西。

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

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

答案 2 :(得分:0)

由于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);
        }
    }
});

就是这样。