Intereting Posts
Android M + Retrofit + JSON: невозможно создать конструктор полей Как установить поля для TextView программно? Как я могу повернуть эмулятор Android из тестового кода? Передача событий касания к родительскому виду Android: пример getRelativeTime Запуск приложения Android на весь экран и пейзаж Android L игнорирует фигуры в качестве выделенного фона Ripples не отображается с помощью selectableItemBackground как планшет на CardView с устройством Android 5.0 Повернуть рамку, содержащую динамические кнопки Как узнать, какой маркер был нажат на Google Maps v2 для Android? SyncAdapter: создана учетная запись, requestSync ОК, но setSyncAutomatically не работает Как проверить активность, которая использует ContentProvider, не влияя на производственную базу данных? Proguard вызывает RuntimeException (Unmarshalling неизвестный тип кода) в классе Parcelable Развертывание приложений Android Qt 5.1 Как реализовать Экспорт sqlite Для excel / csv-файла в android?

Как выделить отфильтрованный текст при использовании виджета SearchView в android

Я реализовал виджет SearchView в своем приложении. Прекрасно работает. Теперь мне нужно сделать это, всякий раз, когда я SearchView Bar слово в моей SearchView Bar , отфильтрованный результат должен показывать выделенное слово. как:

Введите описание изображения здесь

Я использую этот виджет SearchView следующим образом:

 @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); } 

Solutions Collecting From Web of "Как выделить отфильтрованный текст при использовании виджета SearchView в android"

Вы можете использовать Spannable TextView для этого. Надеюсь, что этот метод поможет вам

Метод:

 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; } 

И return originalText выделит текст.

Вы можете использовать это, чтобы выделить все ключевые слова.

  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); } } } }); 

Вы должны сделать это в методе onBindViewHolder () (используя RecyclerView)

Класс 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); } } 

Ваш фильтр (в адаптере)

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

Введите описание изображения здесь