灵活运用SearchView搜索框控件(二)

原创 2016年12月15日 19:21:16

实现自动完成。上代码。布局文件,在ToolBar下面加一个ListView。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.devin.searchviewdemo.MainActivity">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar_top"
        android:layout_width="match_parent"
        android:background="#d36302"
        android:layout_height="?actionBarSize">
    </android.support.v7.widget.Toolbar>

    <ListView
        android:id="@+id/list_container"
        android:layout_width="match_parent"
        android:layout_below="@+id/toolbar_top"
        android:layout_height="match_parent"/>
</RelativeLayout>

Activity代码中,设置ListView 的setTextFilterEnabled属性为true,在onQueryTextChange方法中设置setFilterText过滤器。

public class MainActivity extends AppCompatActivity implements
        SearchView.OnQueryTextListener {

    private static final String TAG = "SearchView";
    private SearchView searchView;
    private Toolbar mToolBar;
    private ListView mListView;
    private ArrayAdapter<String> adapter;
    private Menu menu;
    private String[] citys={"hanzhong","hangzhou","hankou","tianjin","tianshui","nanjing","nanning"};
    private List<String> dataList;
    //SearchView中的编辑框,这个编辑框是个android.support.v7.widget.SearchView$SearchAutoComplete
    private SearchView.SearchAutoComplete searchText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     * 初始化
     */
    private void initView() {
        mToolBar = (Toolbar) findViewById(R.id.toolbar_top);
        setSupportActionBar(mToolBar);
        mListView = (ListView) findViewById(R.id.list_container);
        dataList=new ArrayList<>();
        getData();
    }

    private void getData() {
        for(String str:citys) {
            dataList.add(str);
        }
        adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,citys);
        mListView.setAdapter(adapter);
        mListView.setTextFilterEnabled(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_option_menu, menu);
        //取到menu对象,一边在其他地方调用
        this.menu = menu;
        MenuItem item = menu.findItem(R.id.main_menu_item_search);//获得菜单对象
        searchView = new SearchView(this);//添加搜索控件
        item.setActionView(searchView);//将SearchView控件添加到该菜单项中

        //searchView.setIconified(false);//设置默认展开
        //searchView.setQueryHint("搜索关键字");//设置搜索关键字提示
        searchView.setOnQueryTextListener(this);//设置搜索监听
        //因为我们添加了一个自定义的提交按钮,所以将默认的按钮设为无效
        //searchView.setSubmitButtonEnabled(true);//设置提交按钮是否有效
        //搜索栏关闭事件
        searchView.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
                Log.i(TAG, "关闭");
                return false;
            }
        });
        //获取搜索框文本控件
        searchText = (SearchView.SearchAutoComplete) searchView.findViewById(R.id.search_src_text);
        return true;
    }

    /**
     * 点击提交
     *
     * @param query
     * @return
     */
    @Override
    public boolean onQueryTextSubmit(String query) {
        //有了自定义提交按钮就不用这里了
        Log.i(TAG, "submit:" + query);
        return false;
    }

    /**
     * 文本变化
     *
     * @param newText
     * @return
     */
    @Override
    public boolean onQueryTextChange(String newText) {
        MenuItem btnItem = menu.findItem(R.id.main_menu_item_btn_search);
        //监控文本变化,如果为空就隐藏自定义的按钮,否则就显示
        if (newText.isEmpty()) {
            btnItem.setVisible(false);
            //清除过滤器
            mListView.clearTextFilter();
        } else {
            btnItem.setVisible(true);
        }
        //设置过滤器文本
        mListView.setFilterText(newText);
        return true;
    }

    /**
     * 菜单项选择监听
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.main_menu_item_btn_search:
                //自定义的搜索提交按钮
                Toast.makeText(MainActivity.this, searchText.getText().toString(), Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
}

设想:如果过滤过程中能够使关键文本高亮显示就好了。初步想法自定义一个item布局,放两个textView,根据搜索关键字将符合条件的列表项字符串拆分显示。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android基础控件—SearchView

1.SearchView是什么?        SearchView是Android原生的搜索框控件,可以很方便的添加到用户界面中,用于用户的搜索查询功能。但是SearchView的UI是固定的,自定...
  • ZackChu
  • ZackChu
  • 2017年03月31日 10:02
  • 1628

Android开发SearchView+ListView实现搜索建议

Android开发中,搜索建议的实现

Android自定义View——自定义搜索框(SearchView)

概述 在Android开发中,当系统数据项比较多时,常常会在app添加搜索功能,方便用户能快速获得需要的数据。搜索栏对于我们并不陌生,在许多app都能见到它,比如豌豆荚 在某些情况下,我们希望...
  • jdsjlzx
  • jdsjlzx
  • 2015年06月16日 10:06
  • 104738

SearchView和Listview的绑定,模糊查询

其中最重要的部分是应用了SimpleCursorAdapter 并且模糊查询处的语句 Cursor newCursor = helper.query("person", "pname ...

Android searchView和listview实现搜索

http://blog.csdn.net/yelangjueqi/article/details/8994726 Android searchView和listview实现搜索 ...

Android searchView和listview实现搜索

searchView是一个为用户提供输入搜索查询和提交请求给搜索提供者的用户界面部件,显示查询建议或结果列表!本篇介绍一下将searchView加入到自定义标题栏布局中,结合listview实现搜索,...

Android 利用SearchView实现ListView过滤

Android 利用SearchView实现ListView过滤

关于SearchView的使用和遇到的问题

关于SearchView的使用和遇到的问题 1、在menu.xml中配置SearchView。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:灵活运用SearchView搜索框控件(二)
举报原因:
原因补充:

(最多只允许输入30个字)