如何在列表视图滚动时隐藏搜索视图

时间:2014-07-31 15:49:43

标签: android android-listview android-search

我想实现一个具有搜索功能的活动,该搜索功能可以搜索列表视图的内容。搜索栏应该位于列表视图的顶部,当它向下滚动列表视图时,它应该向用户隐藏。当他在搜索某些东西时,它应该始终位于列表视图之上!我该如何实现它。 最诚挚的问候!

1 个答案:

答案 0 :(得分:1)

我假设您知道如何使用SearchView在ListView上创建XML布局,它可以放在垂直LinearLayout内。棘手的部分是如何操纵SearchView,对吧?

您可以在ListView上注册一个侦听器,如下所示:

    listView.setOnScrollListener(new AbsListView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            switch (scrollState) {
                case SCROLL_STATE_IDLE:
                    //scroll was stopped, let's show search bar again
                    break;
                case SCROLL_STATE_TOUCH_SCROLL:
                    //user is scrolling, let's hide search bar
                    break;
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem > 0) {
                //user scrolled down, first element is hidden
            }

        }
    });

如您所见,您将被告知状态更改,如果您想在触摸事件期间隐藏搜索视图,则可以使用它。或者,您可以倾听不断变化的可见元素。这个简单的if语句检查firstVisibleItem > 0将告诉您用户何时向下滚动。您还可以跟踪消失的列表项,并在显示或隐藏任何项目时做出反应。


另一种监听滚动更改的方法是扩展ListView并覆盖onScrollChanged()方法,例如

class MyListView extends ListView {

    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        for (Callbacks c : mCallbacks) {
            c.onScrollChanged(l - oldl, t - oldt);
        }
    }

    @Override
    public int computeVerticalScrollRange() {
        return super.computeVerticalScrollRange();
    }

    public void addCallbacks(Callbacks listener) {
        if (!mCallbacks.contains(listener)) {
            mCallbacks.add(listener);
        }
    }

    public static interface Callbacks {
        public void onScrollChanged(int deltaX, int deltaY);
    }
}

Google人员在IOSched app。

中做了类似的事情