MaterialSearchView搜索

作者: 君袅 | 来源:发表于2019-03-20 20:43 被阅读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清空,只添加你重新请求的数据,只显示他搜索的内容, 上拉刷新可恢复成没有搜索时的内容

    相关文章

      网友评论

        本文标题:MaterialSearchView搜索

        本文链接:https://www.haomeiwen.com/subject/oyfxvqtx.html