Android 为动态内容保留滚动视图滚动位置
我想归档的内容可以用一张图片来最好地解释 灰色框表示屏幕,蓝色框表示元信息,白色圆形框表示搜索视图,红色框表示搜索返回的项目 到目前为止,我已经做到了这一点,但是当用户搜索某个内容时,问题就出现了,并且这些项目超出了屏幕(1)。之后,用户向下滚动,因此元信息在屏幕(2)之外。用户现在仍然可以输入新的搜索查询,从而更改项目。但是,当新查询返回的项目太少而无法填充屏幕的其余部分(3)时,ScrollView将“跳回”顶部(不在图像中,不需要)。我想要的是SearchView保持不变的行为(3)。在这种状态下,用户可以滚动回顶部(4)。如果她这样做了,则无法向后滚动,相反,将显示overscroll指示器 类似的行为可以在Google+应用程序中看到。从开始屏幕转到您的个人资料(点击顶部的姓名)。您将看到三个注册(“关于我”、“帖子”、“照片”*)。例如,我没有在那里的照片和行为描述 编辑滚动视图是视图的根 编辑基本布局结构Android 为动态内容保留滚动视图滚动位置,android,scrollview,Android,Scrollview,我想归档的内容可以用一张图片来最好地解释 灰色框表示屏幕,蓝色框表示元信息,白色圆形框表示搜索视图,红色框表示搜索返回的项目 到目前为止,我已经做到了这一点,但是当用户搜索某个内容时,问题就出现了,并且这些项目超出了屏幕(1)。之后,用户向下滚动,因此元信息在屏幕(2)之外。用户现在仍然可以输入新的搜索查询,从而更改项目。但是,当新查询返回的项目太少而无法填充屏幕的其余部分(3)时,ScrollView将“跳回”顶部(不在图像中,不需要)。我想要的是SearchView保持不变的行为(3)。在
<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);
}
}
});