【问题标题】:How to hide search view when list view is scrolling列表视图滚动时如何隐藏搜索视图
【发布时间】:2014-07-31 15:49:42
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过 java 中的 setVisibility(View.gone)?还有onScrollListener

标签: android android-listview android-search


【解决方案1】:

我假设您知道如何在 ListView 之上使用 SearchView 创建 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 应用程序中做了类似的事情。

【讨论】:

猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2023-04-04
  • 2014-08-23
  • 2011-10-27
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多