Выделите искомый текст в элементах ListView

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

У меня есть ListView и я использую пользовательский адаптер для отображения данных. Теперь я хочу изменить цвет текста в обычном тексте, как показано выше.

Вот код для SearchView

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbar_menu_item, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchView searchView = (SearchView) menu.findItem(R.id.action_search) .getActionView(); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView.setOnQueryTextListener(this); return super.onCreateOptionsMenu(menu); } public boolean onQueryTextChange(String newText) { // this is adapter that will be filtered if (TextUtils.isEmpty(newText)){ lvCustomList.clearTextFilter(); } else{ lvCustomList.setFilterText(newText.toString()); } return false; } @Override public boolean onQueryTextSubmit(String query) { return false; } 

Спасибо.

Solutions Collecting From Web of "Выделите искомый текст в элементах ListView"

Я предполагаю, что у вас есть пользовательский адаптер с getCount() и getView() реализованный и уже фильтрующий элементы, и вам просто нужна полужирная часть.

Для этого вам нужно использовать SpannableString , который в основном содержит текст с прикрепленной разметкой. Например, TextAppearanceSpan можно использовать для изменения шрифта, стиля шрифта, размера и цвета.

Итак, вы должны обновить getView() для вашего адаптера, чтобы изменить часть, в которой вы используете textView.setText() во что-то более или менее:

 String filter = ...; String itemValue = ...; int startPos = itemValue.toLowerCase(Locale.US).indexOf(filter.toLowerCase(Locale.US)); int endPos = startPos + filter.length(); if (startPos != -1) // This should always be true, just a sanity check { Spannable spannable = new SpannableString(itemValue); ColorStateList blueColor = new ColorStateList(new int[][] { new int[] {}}, new int[] { Color.BLUE }); TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, blueColor, null); spannable.setSpan(highlightSpan, startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(spannable); } else textView.setText(itemValue);