MaterialSearchView搜索
2019-03-20 本文已影响102人
君袅
Android Material Design 中其实有搜索框SearchView,但是并不怎么好用,所以这里介绍三方的一个控件
MaterialSearchView,地址:https://github.com/MiguelCatalan/MaterialSearchView
使用:
1.依赖
implementation 'com.miguelcatalan:materialsearchview:1.4.0'
2.布局
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
app:titleTextColor="@color/white"
android:id="@+id/toolBar"
android:background="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<com.miguelcatalan.materialsearchview.MaterialSearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
3.添加menu
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_action_action_search"
android:orderInCategory="100"
android:title="@string/abc_search_hint"
app:showAsAction="always" />
4.添加选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.home_nenu, menu);
mSearchItem = menu.findItem(R.id.action_search);
mSearchItem.setVisible(false);
mSearchView.setMenuItem(mSearchItem);
return true;
}
5.监听
private void initSou() {
mSearchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
EventBus.getDefault().postSticky(query);
//提交查询信息的监听
ToastUtil.showShort("提交的搜索信息为:"+ query);
//Do some magic
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Do some magic
//输入框文本发生改变的时候回调
ToastUtil.showShort("文本发生改变"+ newText);
return false;
}
});
mSearchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() {
@Override
public void onSearchViewShown() {
//搜索框显示的时候回调
//Do some magic
Log.e("zl", "onSearchViewShown: "+"show" );
}
@Override
public void onSearchViewClosed() {
//Do some magic
//搜索框折叠的时候回调
Log.e("zl", "onSearchViewClosed: "+"close");
}
});
}
6.判断搜索框是否展开+代码折叠搜索框(点击回退)
/**
* 点击返回键的时候会调用
*/
@Override
public void onBackPressed() {
if (mSearchView.isSearchOpen()) {
mSearchView.closeSearch();
} else {
super.onBackPressed();
}
}
7.通常我们会遇到有的fragment有搜索栏,但有的没有,我们要在切换fragment是只把有的添加搜索框
/**
* 切换碎片
*
* @param type ,除了是类型外,还是 position
*/
private void switchFragment(int type) {
FragmentTransaction transaction = manager.beginTransaction();
Fragment fragment = list.get(type);
//fragment是否有添加过
if (!fragment.isAdded()) {
transaction.add(R.id.frame, fragment);
}
//隐藏上一个碎片
Fragment lastFragment = list.get(mLastType);
transaction.hide(lastFragment);
//显示碎片
transaction.show(fragment);
transaction.commit();
//切换完成之后,当前的fragmnet就是下一次切换要隐藏的Fragmnet
mLastType = type;
//隐藏或者显示searchView------------------------------------在这判断type是切换的fragment的坐标
if (type == TYPE_WEIXIN || type == TYPE_GANK){
mSearchItem.setVisible(true);
}else {
mSearchItem.setVisible(false);
}
}
二.以上是基本的使用
但是,在我们通常使用的时候,需要将搜索出来的对象,也需要显示出来,所以得基本思路就是通过,第5步骤的监听将输入的内容,传到对应的fragment中将,然后,重新请求输入内容的接口,复用adapter将原来的list清空,只添加你重新请求的数据,只显示他搜索的内容, 上拉刷新可恢复成没有搜索时的内容