First of all
Search results (Here I just simulate the data, real and when the server goes, the data returned should contain the keywords)
Simulation of an interface without a search result
Specific implementation
In this in a sentence, is to do one thing, split into a number of summary, not in the development of the time to touch the brain and can also control the progress of development.
The idea is actually very simple, we listen to the changes in the input box, and then after the text changes to request the server, and then take the results we need to display the data.
- The first step: the monitoring of the search box
Et_search.addtextchangedlistener (NewTextwatcher () {@Override Public void beforetextchanged(Charsequence S,intStartintCountintAfter) {}/** * Callback This method when the text in the search box changes * @param charsequence The text of the input box * @param start starts * @param before * @param count words */ @Override Public void ontextchanged(Charsequence charsequence,intStartintBefore,intCount) {//Make a logical request here}@Override Public void aftertextchanged(Editable s) { } });
- Step two: Make related logical requests
if(! Textutils.isempty (charsequence) && charsequence.length () >3) {//Here are 3 only to simulate the requestMkey = Charsequence.tostring (); InitData (Charsequence.tostring ()); Changestates (state); }Else{state = no_tthing; Changestates (state); }/** * Get data for the first time * * @param Key Highlight */ Private void InitData(String key) {//Here is the actual network request is to go to the network to obtain dataString result = Jsonutils.getjson ( This,"Search.json"); Gson Gson =NewGson (); Searchbean Searchbean = Gson.fromjson (result, searchbean.class);if(Searchbean! =NULL) {Mdatabeen = Searchbean.getdata ();if(Mdatabeen! =NULL&& mdatabeen.size () >0) {state = Show_data; Msearchadapter.loaddata (Mdatabeen, key); }Else{state = no_tthing; } }Else{state = no_tthing; } }/** * Change Search Status * * @param State Search Key value */ Private void changestates(intState) {Switch(state) { CaseNO_TTHING:mNoLayout.setVisibility (view.visible); Recycler_view.setvisibility (view.invisible); Break; CaseSHOW_DATA:mNoLayout.setVisibility (View.gone); Recycler_view.setvisibility (view.visible); Break; } }
- Step three: Make discoloration
/** * @param Context context * @param wholestr All text * @param highlightstr Change the color of the text * @param color * / Public Stringformatutil(context context, string wholestr, String highlightstr,intColor) { This. Mcontext = Context; This. wholestr = Wholestr; This. highlightstr = Highlightstr; This. color = color; }/** * Fill Color * * @return stringformatutil * * PublicStringformatutilFillColor() {if(! Textutils.isempty (WHOLESTR) &&! Textutils.isempty (HIGHLIGHTSTR)) {Spbuilder =NewSpannablestringbuilder (WHOLESTR);//matching rulesPattern p = pattern.compile (HIGHLIGHTSTR);//Match fieldMatcher m = P.matcher (Spbuilder);//Coloringcolor = Mcontext.getresources (). GetColor (color);//Start a loop to find if there is a keyword in it so that multiple keywords appear in a sentence will be highlighted while(M.find ()) {intStart = M.start ();intEnd = M.end (); Spbuilder.setspan (NewForegroundcolorspan (color), start, end, spanned.span_exclusive_exclusive); }return This; }return NULL; }/** * Gets the results that have been changed (this time has been highlighted, do not get this result when the ToString () or the color will be removed) * * @return result */ PublicSpannablestringbuilderGetResult() {if(Spbuilder! =NULL) {returnSpbuilder; }return NULL; }//To use the tool class, that is, when assigning a value to the title //This is the use of adapter inside the rulesMformatutil =NewStringformatutil (Holder.itemView.getContext (), Databean.gettitle (), Mlightstr, r.color.coloraccent). FillColor (); Holder.tv_title.setText (Mformatutil.getresult ());
Demo description
The local JSON here is my own definition, and in the search for the time to add their own logic, if the actual project needs to be in accordance with their own needs to make changes. Related display do not need to care, here is just to give you a search and keyword highlighting a way of thinking.
Demo Code Portal
- Https://github.com/wuyinlei/SearchViewDemo
Reference articles
- Android TextView to achieve keyword highlighting
Android Search results display highlighting (with data sliding bottom auto refresh)