1

我有一个活动,其布局由一个 ScrollView 组成,该 ScrollView 包含页面的主布局(我们称之为“主视图”)。我使用 ScrollView 的原因是在一些较小的屏幕上,内容可能比屏幕本身占用更多的垂直空间。我想在 ScrollView 或上方添加一个视图,该视图将从屏幕上绘制出来(我们将其称为“隐藏视图”),并且仅在用户已经在顶部时拉下时才会显示滚动视图。以下是我所描述的示例:

向下滚动之前

向下滚动后

另外,为了使它更复杂,如果 ScrollView 被滚动到顶部,我希望它在“隐藏视图”出现之前停止。我只希望在 ScrollView 已经滚动到顶部后用户下拉时显示“隐藏视图”(类似于 pulltorefresh)。

我还希望用户能够向上滚动以“重新隐藏”隐藏的视图。

我不确定实现这一点的最佳方法。我玩过 pulltorefresh 库,但对于我想要完成的事情来说,它似乎太强大了。另外,这并不是我想要的效果。例如,我可以在下拉后显示“正在加载...”屏幕,但在那之后,我希望我的“隐藏视图”保留在屏幕上,直到用户将其推回。如果我可以使用 pulltorefresh 完成此操作,那就太好了,但是我在尝试遵循库的代码时迷失了方向。

我还考虑过简单地将隐藏视图添加到 ScrollView,并使用scrollView.fullScroll(ScrollView.FOCUS_DOWN)强制 ScrollView 滚动到底部。这样做的问题是,如果设备的屏幕不是很小,有足够的空间让“主视图”和“隐藏视图”同时显示,不需要滚动。此外,在“隐藏视图”出现在屏幕上之前,我不会得到 ScrollView 停止的效果。

我考虑过的另一个选项是执行我上面描述的操作,然后在将 ScrollView 强制到底部之前调整“主视图”的大小以匹配设备的屏幕大小。但同样,我会失去 ScrollView 停止的效果。

我觉得必须有一种更简单或更优雅的方式来做到这一点,而我却错过了。谢谢!

4

2 回答 2

1

我这样做的方法是监听用户何时滚动到页面顶部,然后尝试再次向上滚动页面。我必须基本上在 ListView 上的两个侦听器 onScrollListener 和 onTouchListener 之间进行通信。当用户已经在顶部尝试向上滚动时,会出现一个搜索框。一旦他们向下滚动,它就会消失。

这是代码:

lstView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                if (listIsAtTop() && expose)
                    searchBox.setVisibility(View.VISIBLE);
                break;
            case MotionEvent.ACTION_DOWN:
                searchBox.setVisibility(View.GONE);
                break;
        }

        return false;
    }
});
lstView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && listIsAtTop())
            expose = true;
        else if (!listIsAtTop())
            expose = false;
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    }
});

查找列表何时位于最顶部且无法进一步滚动的辅助方法:

private boolean listIsAtTop()   {
   if (lstView.getChildCount() == 0)
       return true;
   return lstView.getChildAt(0).getTop() == 0;
}

然后在最初设置为 true 的类中公开一些静态变量。为我工作。

于 2014-05-28T18:50:38.120 回答
0

我相信这样的东西你正在寻找的?它类似于向下滚动时出现的 google now 搜索框

于 2013-06-19T16:38:59.380 回答