我想要存档的内容最好用图像来解释
灰色框表示屏幕,蓝色框表示元信息,白色圆形框表示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>
*)假设从德语应用程序翻译。
答案 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);
}
}
});
就是这样。