How to highlight filtered text when using SearchView widget in android

I implemented the SearchView widget in my application. His work is wonderful. Now I need to do this, whenever I type a word in my SearchView Bar , the filtered result should show the highlighted word. eg:

enter image description here

I use this SearchView widget as:

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.myMenu , menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView sv = new SearchView(getActivity()); // Changing the color of Searchview widget text field to white. int searchSrcTextId = getResources().getIdentifier("android:id/search_src_text", null, null); EditText searchEditText = (EditText) sv.findViewById(searchSrcTextId); searchEditText.setTextColor(Color.WHITE); sv.setOnQueryTextListener(this); searchItem.setActionView(sv); super.onCreateOptionsMenu(menu, inflater); } 
+8
android searchview
source share
3 answers

You can use Spannable TextView for this. hope this method helps you

Method:

 public static CharSequence highlightText(String search, String originalText) { if (search != null && !search.equalsIgnoreCase("")) { String normalizedText = Normalizer.normalize(originalText, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").toLowerCase(); int start = normalizedText.indexOf(search); if (start < 0) { return originalText; } else { Spannable highlighted = new SpannableString(originalText); while (start >= 0) { int spanStart = Math.min(start, originalText.length()); int spanEnd = Math.min(start + search.length(), originalText.length()); highlighted.setSpan(new ForegroundColorSpan(Color.BLUE), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); start = normalizedText.indexOf(search, spanEnd); } return highlighted; } } return originalText; } 

and return originalText will highlight the text.

+5
source share

You must do this in the onBindViewHolder () method (using RecyclerView)

class YourAdapter

 String searchString=""; @Override public void onBindViewHolder(AllMessageAdapter.DataObjectHolder holder, final int position) { holder.message.setText(mDataset.get(position).Message); AllMessageList.Message message=mDataset.get(position); String name = message.Message.toLowerCase(Locale.getDefault()); if (name.contains(searchString)) { int startPos = name.indexOf(searchString); int endPos = startPos + searchString.length(); Spannable spanString = Spannable.Factory.getInstance().newSpannable(holder.message.getText()); spanString.setSpan(new ForegroundColorSpan(Color.RED), startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); holder.message.setText(spanString); } } 

Your filter (in adapter)

 public void setFilter(ArrayList<AllMessageList.Message> countryModels,String searchString) { this.searchString=searchString; mDataset = new ArrayList<>(); mDataset.addAll(countryModels); notifyDataSetChanged(); } 

enter image description here

+4
source share

You can use this to highlight all keywords.

  button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String ett = edittext.getText().toString(); String tvt = textview.getText().toString(); int ofe = tvt.indexOf(ett, 0); Spannable spannable = new SpannableString(tvt); for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) { ofe = tvt.indexOf(ett, ofs); if (ofe == -1) break; else { ColorStateList blueColor = new ColorStateList(new nt[][] { new int[] {} }, new int[] { Color.BLUE }); TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, blueColor, null); spannable.setSpan(highlightSpan, ofe, ofe+edittext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textview.setText(spannable); } } } }); 
+2
source share

All Articles