【问题标题】:How to know when SearchView in action bar is closed?如何知道操作栏中的 SearchView 何时关闭?
【发布时间】:2014-11-10 20:29:43
【问题描述】:

我有一个问题:我在Fragment 中有一个listView,我实现了一个searchView (actionView) 以使用searchView onQueryTextChange 事件过滤listView 中的列表。我在这部分没有问题,一切正常。

adapter = new ListaEmpleadosAdapter(getActivity(), empleadoItems, context);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_buscar).getActionView();

SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String s) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String s) {
        try {
            adapter.getFilter().filter(s);
            adapter.notifyDataSetChanged();
        } catch (Exception e) {
            System.err.println("ERROR FragmentEmpleado -> " + e.toString());
        }
        return true;
    }
};

当我第一次搜索并按下返回按钮时,软键盘关闭。这很正常。当我再次按下返回按钮时,searchView 关闭,这很正常,但列表没有返回到初始项。

如何在 searchView 折叠时获取事件(因为searchView.setOnCloseListener 不起作用)以恢复初始列表项?或以任何方式恢复删除适配器过滤器的初始列表项...

历史:

  1. 员工名单

  1. 具有特定过滤器的员工列表(第一次按下后退按钮后,键盘关闭)

  1. searchView 关闭的员工列表(但在第二次按下后退按钮后没有恢复原始列表)

非常感谢!

【问题讨论】:

  • 如何解决问题我有同样的问题#Cristiam Mercado

标签: android list listview searchview


【解决方案1】:

SearchView 上有一个方法会在搜索视图折叠 (onActionViewCollapsed) 时触发,但它没有任何事件。为了解决这个问题,我创建了自己的类,继承自 SearchView,并定义了 2 个事件来捕获折叠和展开。该类还提供了连接事件处理程序的方法。

public class MySearchView extends SearchView {

    OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;
    OnSearchViewExpandedEventListener mOnSearchViewExpandedEventListener;

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

    @Override
    public void onActionViewCollapsed() {
        if (mSearchViewCollapsedEventListener != null)
            mSearchViewCollapsedEventListener.onSearchViewCollapsed();
        super.onActionViewCollapsed();
    }

    @Override
    public void onActionViewExpanded() {
        if (mOnSearchViewExpandedEventListener != null)
            mOnSearchViewExpandedEventListener.onSearchViewExpanded();
        super.onActionViewExpanded();
    }

    public interface OnSearchViewCollapsedEventListener {
        public void onSearchViewCollapsed();
    }

    public interface OnSearchViewExpandedEventListener {
        public void onSearchViewExpanded();
    }

    public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
        mSearchViewCollapsedEventListener = eventListener;
    }

    public void setOnSearchViewExpandedEventListener(OnSearchViewExpandedEventListener eventListener) {
        mOnSearchViewExpandedEventListener = eventListener;
    }


}

【讨论】:

  • 哦,谢谢!为我工作! :)
  • 这对我也有用,但我必须修改它,以便在我们的侦听器之前调用 super.onActionViewExpanded()。否则,我试图改变的超级 onActionViewExpanded 的行为仍在发生。但是,如果您从不想更改超级的行为,则原始答案很好。我想摆脱 setQuery("") 以便在打开时记住上一个查询。
  • 我们在哪里调用 MySearchView 类?我有同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2014-11-26
  • 2018-02-15
  • 1970-01-01
  • 2014-03-02
  • 2013-09-20
相关资源
最近更新 更多