在使用searchview和listview+toolbar实现搜索关联
分为以下几步:
一,添加toolbar的布局如:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:background="#39cbec"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
>
</android.support.v7.widget.Toolbar>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>```
二, 然后 在menu文件中toolbar添加searchview菜单,默认为图标,可以实现点击展开
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<item
android:id="@+id/search"
android:title="dd"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@mipmap/abc_ic_search_api_mtrl_alpha"
/>
</menu>```
这里需要把showAsAction设置为collapseAction|ifRoom ddd
actionViewClass设置为系统或者v7库的searchview组件
这里设置为app,是因为android studio自动生成项目后,项目自动继承ActionBarActivity类,代码就会出现兼容问题
Ddd showAsAction 属性共五个值:
ifRoom 会显现item,但是如果有4个或以上会隐藏在溢出列表中 ,但是并不局限于4个,可以根据的宽窄never永远不会显示
Always 无论是否溢出,总会显示
Never 从不显示
withText示意actionbar 要显示文本标题,actionbar会尽可能显示标题,但是如果空间有限,文本标题可能显示不全
CollapseActionView 声明这个操作视窗应该被折叠一个按钮中,当用户选择这个按钮时,这个操作视窗展开,否则,这个操作视窗在默认的情况下是可见的,并且即使在用于不适用的时候,也要占据有效空间
一般要配合ifRoom使用
三,在xml中注册,隐藏Actionbar 设置如下
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SEARCH"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />```
新建一个searchable.xml ,主要设置android:label,在这里需要注意xml和searchable的label需要设置为同一个值 ,为这个花了好长时间
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="search"
android:label="@string/app_name">
</searchable>```
四,在主Mainactivity中加载菜单
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu,menu);
MenuItem menuItem=menu.findItem(R.id.search);//
searchView= (SearchView) MenuItemCompat.getActionView(menuItem);//加载searchview
searchView.setOnQueryTextListener(this);//为搜索框设置监听事件
searchView.setSubmitButtonEnabled(true);//设置是否显示搜索按钮
searchView.setQueryHint("查找");//设置提示信息
searchView.setIconifiedByDefault(true);//设置搜索默认为图标
return true; }```
五,加载toolbar,绑定listview
listView= (ListView) findViewById(R.id.listview);
Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
listView.setTextFilterEnabled(true);//设置为可过滤的
六,监听事件实现searchview和listview搜索
public boolean onQueryTextChange(String newText) {
Toast.makeText(this,"154",Toast.LENGTH_SHORT).show();
if (TextUtils.isEmpty((newText))){
listView.clearTextFilter();
}else{
listView.setFilterText(newText);}
return true;}```
好,最终终于实现toolbar上实现searchview的搜索,绑定listview