<强>首先的效果图强>
搜索到结果(这里我只是模拟数据,真正和服务器走得时候,返回来的数据都应该包含关键字的)
模拟的没有搜索结果的界面
<强>具体实现强>
在这插一句哈,就是做一件事情,拆分成多个小结,不至于在开发的时候摸不着头脑而且还能把控开发的进度。
思路其实很简单,我们监听输入框的变化,然后在文字变化之后去请求服务器,然后取到我们需要的结果,进行数据展示即可。
第一步:搜索框的监听
et_search。addTextChangedListener(新TextWatcher () { @Override 公共空间beforeTextChanged (CharSequence进行年代,int, int数,int后){ }/* * *当搜索框中的文字发生变化的时候回调此方法 * @param charSequence进行输入框的文字 * @param开始开始 * @param之前 * @param数字数 */@Override 公共空间> ' ' ' 如果(! TextUtils.isEmpty (charSequence进行),,charSequence.length()比;3){//这里的3只是为了模拟请求 mKey=charSequence.toString (); initData (charSequence.toString ()); changeStates(状态); 其他}{ 状态=NO_TTHING; changeStates(状态); }/* * *首次获取数据 * * @param关键高亮值 */私人空间initData (String键){//这里是模拟网络请求的实际就是走网络获取数据=JsonUtils字符串结果。getJson(这个,”search.json”); Gson Gson=new Gson (); SearchBean SearchBean=gson.fromJson(因此,SearchBean.class); 如果(searchBean !=null) { mDataBeen=searchBean.getData (); 如果(mDataBeen !=零,,mDataBeen.size()比;0){ 状态=SHOW_DATA; mSearchAdapter。loadData (mDataBeen、关键); 其他}{ 状态=NO_TTHING; } 其他}{ 状态=NO_TTHING; } }/* * *改变搜索状态 * * @param国家搜索关键值 */私人空间changeStates (int状态){ 开关(状态){ 案例NO_TTHING: mNoLayout.setVisibility (View.VISIBLE); recycler_view.setVisibility (View.INVISIBLE); 打破; 案例SHOW_DATA: mNoLayout.setVisibility (View.GONE); recycler_view.setVisibility (View.VISIBLE); 打破; } } >之前第三步:进行变色
/* * * @param上下文上下文 * @param wholeStr全部文字 * @param highlightStr改变颜色的文字 * @param色颜色 */公共StringFormatUtil (highlightStr wholeStr上下文语境,字符串,字符串,int颜色){ 这一点。mContext=上下文; 这一点。wholeStr=wholeStr; 这一点。highlightStr=highlightStr; 这一点。颜色=颜色; }/* * *填充颜色 * * @return StringFormatUtil */公共StringFormatUtil fillColor () { 如果(! TextUtils.isEmpty (wholeStr),,! TextUtils.isEmpty (highlightStr)) { spBuilder=new SpannableStringBuilder (wholeStr);//匹配规则 模式p=Pattern.compile (highlightStr);//匹配字段 匹配器m=p.matcher (spBuilder);//上色 颜色=mContext.getResources () .getColor(颜色);//开始循环查找里面是否包含关键字使得一句话中出现多个关键词都会被高亮 而(m.find ()) { int开始=m.start (); int结束=m.end (); spBuilder。setSpan(新ForegroundColorSpan(颜色),开始,结束,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } 返回; } 返回null; }/* * *获取到已经更改好的结果(这个时候已经实现了高亮,在获取这个结果的时候不要toString()要不然会把色调去除的) * * @return结果 */公共SpannableStringBuilder getResult () { 如果(spBuilder !=null) { 返回spBuilder; } 返回null; }//进行工具类使用,也就是在给标题赋值的时候使用//这个是适配器里面的使用规则 mFormatUtil=new StringFormatUtil (holder.itemView.getContext (), dataBean.getTitle (), mLightStr, R.color.colorAccent) .fillColor (); holder.tv_title.setText (mFormatUtil.getResult ()); ' ' ' >之前<强>演示说明强>
Android搜索结果显示高亮实例(有数据滑动底部自动刷新)