实现自动完成。上代码。布局文件,在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,根据搜索关键字将符合条件的列表项字符串拆分显示。
本文介绍如何在Android应用中使用SearchView实现搜索功能,并通过ListView展示搜索结果。具体包括设置TextView的过滤功能、监听文本变化及自定义搜索项布局。
&spm=1001.2101.3001.5002&articleId=53674629&d=1&t=3&u=10e2ce02ad0b4cd1bf11016e756aec41)
6324

被折叠的 条评论
为什么被折叠?



