У меня есть SearchView на панели инструментов, который находится над списком CardViews RecyclerView. SearchView работает правильно, фильтруя список на основе ввода текста. Однако код в ListAdapter в методе onBindViewHolder() для выделения текста поиска с помощью Color.GREEN работает неправильно.
Первый CardView возвращается в список Вертикальный RecyclerView никогда не выделяется текст поиска. И тогда другие CardViews с текстом поиска под ним много раз также постоянно не подсвечиваются. Кроме того, прокрутка списка вниз, а затем обратное возвращение к началу списка выделит часть найденного текста поиска, тогда как этот текст не был выделен при первом возвращении списка RecyclerView.
Может быть проблема заключается в использовании ListAdapter в качестве адаптера, поскольку представления обновляются в фоновом потоке, а набор данных не готов?
Есть идеи о том, как правильно выделить текст поиска с помощью ListAdapter в вертикальная прокрутка RecyclerView?
MainActivity
public boolean onCreateOptionsMenu(Menu menu) {
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String searchText) {
ArrayList searchList = new ArrayList();
for (Card cardItem : mCards) {
if (cardItem.getTodo().toLowerCase().contains(searchText.toLowerCase(Locale.US))) {
searchList.add(cardItem);
}
}
if (!searchList.isEmpty()) {
adapter.setFilter(searchList, searchText);
}
Адаптер списка
public class CardRVAdapter extends ListAdapter {
private String searchString = "";
public Spannable spannable;
public void setFilter(List newSearchList, String adapSearchText) {
if (newSearchList != null && !newSearchList.isEmpty()) {
this.searchString = adapSearchText.toLowerCase(Locale.US);
ArrayList tempList = new ArrayList(newSearchList);
submitList(tempList);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView cardBlankText2; // displays text in the CardView and is matched against the search text input.
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.GREEN);
public ForegroundColorSpan getFCS() {
return fcs;
}
}
public ViewHolder(@NonNull final View itemView) {
super(itemView);
cardBlankText2 = itemView.findViewById(R.id.cardBlankText2);
}
void bindData(Card card, final int position) {
spannable = Spannable.Factory.getInstance().newSpannable(cardBlankText2.getText().toString());
// Get any previous spans and remove them
ForegroundColorSpan[] foregroundSpans = spannable.getSpans(0,spannable.length(), ForegroundColorSpan.class);
// Highlight matches from search characters is Green color.
if (searchString != null && !TextUtils.isEmpty(searchString)) {
for (ForegroundColorSpan span : foregroundSpans) {
spannable.removeSpan(span);
}
int index = spannable.toString().toLowerCase(Locale.US).indexOf(searchString);
while (index != -1) {
spannable.setSpan(getFCS(), index, index + searchString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index = spannable.toString().indexOf(searchString,index + searchString.length());
}
cardBlankText2.setText(spannable, TextView.BufferType.SPANNABLE);
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Card card = getCardAt(position);
if (card != null) {
holder.bindData(card, position);
}
}
public Card getCardAt(int position) {
return getItem(position);
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... erview-and
Android: исправлена подсветка текста поиска ForegroundColorSpan с помощью RecyclerView и ListAdapter ⇐ JAVA
Программисты JAVA общаются здесь
1727855334
Anonymous
У меня есть SearchView на панели инструментов, который находится над списком CardViews RecyclerView. SearchView работает правильно, фильтруя список на основе ввода текста. Однако код в ListAdapter в методе onBindViewHolder() для выделения текста поиска с помощью Color.GREEN работает неправильно.
Первый CardView возвращается в список Вертикальный RecyclerView никогда не выделяется текст поиска. И тогда другие CardViews с текстом поиска под ним много раз также постоянно не подсвечиваются. Кроме того, прокрутка списка вниз, а затем обратное возвращение к началу списка выделит часть найденного текста поиска, тогда как этот текст не был выделен при первом возвращении списка RecyclerView.
Может быть проблема заключается в использовании ListAdapter в качестве адаптера, поскольку представления обновляются в фоновом потоке, а набор данных не готов?
Есть идеи о том, как правильно выделить текст поиска с помощью ListAdapter в вертикальная прокрутка RecyclerView?
[b]MainActivity[/b]
public boolean onCreateOptionsMenu(Menu menu) {
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String searchText) {
ArrayList searchList = new ArrayList();
for (Card cardItem : mCards) {
if (cardItem.getTodo().toLowerCase().contains(searchText.toLowerCase(Locale.US))) {
searchList.add(cardItem);
}
}
if (!searchList.isEmpty()) {
adapter.setFilter(searchList, searchText);
}
[b]Адаптер списка[/b]
public class CardRVAdapter extends ListAdapter {
private String searchString = "";
public Spannable spannable;
public void setFilter(List newSearchList, String adapSearchText) {
if (newSearchList != null && !newSearchList.isEmpty()) {
this.searchString = adapSearchText.toLowerCase(Locale.US);
ArrayList tempList = new ArrayList(newSearchList);
submitList(tempList);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView cardBlankText2; // displays text in the CardView and is matched against the search text input.
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.GREEN);
public ForegroundColorSpan getFCS() {
return fcs;
}
}
public ViewHolder(@NonNull final View itemView) {
super(itemView);
cardBlankText2 = itemView.findViewById(R.id.cardBlankText2);
}
void bindData(Card card, final int position) {
spannable = Spannable.Factory.getInstance().newSpannable(cardBlankText2.getText().toString());
// Get any previous spans and remove them
ForegroundColorSpan[] foregroundSpans = spannable.getSpans(0,spannable.length(), ForegroundColorSpan.class);
// Highlight matches from search characters is Green color.
if (searchString != null && !TextUtils.isEmpty(searchString)) {
for (ForegroundColorSpan span : foregroundSpans) {
spannable.removeSpan(span);
}
int index = spannable.toString().toLowerCase(Locale.US).indexOf(searchString);
while (index != -1) {
spannable.setSpan(getFCS(), index, index + searchString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index = spannable.toString().indexOf(searchString,index + searchString.length());
}
cardBlankText2.setText(spannable, TextView.BufferType.SPANNABLE);
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Card card = getCardAt(position);
if (card != null) {
holder.bindData(card, position);
}
}
public Card getCardAt(int position) {
return getItem(position);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79041428/android-fix-foregroundcolorspan-search-text-highlighting-with-recyclerview-and[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия