SearchView和RecyclerView实现搜索界面,2018/1/1 04

2018年第一篇博客,新的一年新的开始,今年要坚持写下去。
Android Developers 中SerarchView网址
首先xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.searchdemo.MainActivity">

    <RelativeLayout
        android:layout_marginTop="24px"
        android:layout_marginBottom="24px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_marginRight="44px"
            android:layout_marginLeft="33px"
            android:id="@+id/search_cancel_text_view"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:text="取消"
            android:textSize="44px"
            android:textColor="@color/yi_666666"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <android.support.v7.widget.SearchView
            android:id="@+id/search_search_view"
            android:layout_toLeftOf="@id/search_cancel_text_view"
            android:layout_marginLeft="44px"
            app:iconifiedByDefault="true"
            app:searchHintIcon="@mipmap/cm_search"
            app:searchIcon="@mipmap/cm_search"
            app:defaultQueryHint="输入姓名搜索"
            app:queryBackground="@drawable/shape_round_rectangle_f5f5f5_2"
            android:background="@drawable/shape_round_rectangle_f5f5f5_2"
            android:layout_width="match_parent"
            android:layout_height="78px"/>

    </RelativeLayout>
    <View
        android:background="@color/yi_dbdbdb"
        android:layout_width="match_parent"
        android:layout_height="2px"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_marginLeft="44px"
            android:layout_marginTop="44px"
            android:textSize="40px"
            android:textColor="@color/yi_666666"
            android:text="最近搜索"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/search_clear_text_view"
            android:layout_alignParentRight="true"
            android:layout_marginRight="44px"
            android:layout_marginTop="44px"
            android:textSize="40px"
            android:textColor="@color/yi_666666"
            android:text="清空"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RelativeLayout>
    <android.support.v7.widget.RecyclerView
        android:layout_marginTop="33px"
        android:id="@+id/search_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>

其中iconifiedByDefault:控制进入页面时是否直接为搜索状态
true为显示搜索提示图片(searchIcon)点击之后进入搜索状态,之后搜索图片显示为searchHintIcon,提示文字为defaultQueryHint,搜索状态的背景为queryBackground。
false则直接为搜索状态。

代码实现:

一,SearchView 初始设置

//找到SearchView中的textview ,从而修改输入的文字颜色字体大小等
        LinearLayout linearLayout1 = (LinearLayout) mSearchView.getChildAt(0);
        LinearLayout linearLayout2 = (LinearLayout) linearLayout1.getChildAt(2);
        LinearLayout linearLayout3 = (LinearLayout) linearLayout2.getChildAt(1);
        mAutoCompleteTextView = (AutoCompleteTextView) linearLayout3.getChildAt(0);
        mAutoCompleteTextView.setTextSize(13);
        mAutoCompleteTextView.setTextColor(getResources().getColor(R.color.colorAccent));
        mSearchCancelTextView.setOnClickListener(this);
        mSearchClearTextView.setOnClickListener(this);
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                //当点击输入键盘上的确定 按钮时的回调返回输入的搜索的数据
                //这里是通过sp保存数据,并且是把所有搜索的数据转成json之后报错
                mSearchNames.add(query);
                SharedPreferencesHelper.getEditor().putString("search_names", JsonUtil.ListToJsonString(mSearchNames)).commit();
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                mQueryText=newText;
                //为空则为取消状态,点击取消可以返回上一页
                //当有数据时则为搜索状态,点击搜索
                if(mQueryText.equals("")){
                    mState=0;
                    mSearchCancelTextView.setText("取消");
                }else{
                    mState=1;
                    mSearchCancelTextView.setText("搜索");
                }
                return true;
            }
        });

二,RecyclerView初始设置
其中涉及到了FlexFoxLayout这是google推出的一个能够动态显示textView的布局,因为直接使用感觉太过麻烦需要建好多textView,我就改为使用RecyclerView加FlexboxLayoutManager 来实现同样的效果。
FlexFoxLayout Github链接

//从sp中取出之前搜索过的内容
        String searchNames = SharedPreferencesHelper.getSharedPreferences().getString("search_names", "");
        //装成list集合
        mSearchNames = JsonUtil.JsonToListString(searchNames);
        FlexboxLayoutManager flexboxLayoutManager = new FlexboxLayoutManager(this);
        mRecyclerView.setLayoutManager(flexboxLayoutManager);
        mSearchAdapter = new MySearchAdapter();
        mRecyclerView.setAdapter(mSearchAdapter);
private class MySearchAdapter extends RecyclerView.Adapter<SearchViewHolder> {
        @Override
        public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            TextView textView=new TextView(MainActivity.this);
            textView.setTextColor(getResources().getColor(R.color.colorPrimary));
            textView.setTextSize(16);
            //必须是FlexboxLayoutManager下的LayoutParams
            FlexboxLayoutManager.LayoutParams layoutParams= new FlexboxLayoutManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(44,30,44,30);
            textView.setLayoutParams(layoutParams);
            return new SearchViewHolder(textView);
        }

        @Override
        public void onBindViewHolder(SearchViewHolder holder, int position) {
            holder.bindViewHolder();
        }

        @Override
        public int getItemCount() {
            return mSearchNames.size();
        }
    }

    private class SearchViewHolder extends RecyclerView.ViewHolder {

        private SearchViewHolder(View itemView) {
            super(itemView);
        }

        private void bindViewHolder(){
            if(itemView instanceof TextView) {
                //如果itemView是TextView 进行初始化搜索过的数据
                ((TextView) itemView).setText(mSearchNames.get(mSearchNames.size()-getAdapterPosition()-1));
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //处理点击搜索
                    }
                });
            }
        }
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值