У меня есть SearchView на панели инструментов, который находится над списком CardViews RecyclerView. SearchView работает правильно, фильтруя список на основе ввода текста. Однако код в ListAdapter в методе «onBindViewHolder()» для выделения текста поиска с помощью Color.GREEN для каждого CardView не работает.
Я установил логическое значение «isSearchMatched» это значение переключается на true, когда CardView содержит текст, соответствующий тексту SearchView. Затем я использую «isSearchMatched» в onBindViewHolder() плюс submitList() с новым ArrayList для ListAdapter, чтобы распознать изменение элементов CardView, чтобы можно было выделить текст поиска в CardView... безуспешно.Что мне здесь не хватает?
MainActivity
mSearchView.setOnQueryTextListener() {
...
filter(newText)
}
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);
**cardItem.setSearchMatched(true);**
}
}
if (!searchList.isEmpty()) {
adapter.setFilter(searchList, searchText);
}
Card.java // элемент модели
@Entity(tableName = "cards_table")
public class Card implements Parcelable {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "cardId")
public int id;
@ColumnInfo(name = "cardTodo")
private String todo;
@ColumnInfo(name = "cardMatchedSearchText")
private boolean isSearchMatched = false;
...
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(id);
parcel.writeString(todo);
parcel.writeByte((byte) (isSearchMatched ? 1 : 0));
}
private void readFromParcel(Parcel in) {
id = in.readInt();
todo = in.readString();
isSearchMatched = in.readByte() != 0;
}
public int getId() {
return this.id;
}
public String getTodo() {
return this.todo;
}
public boolean isSearchMatched() {
return this.isSearchMatched;
}
public void setId(int id) {
this.id = id;
}
public void setTodo(String todo) {
this.todo = todo;
}
public void setSearchMatched(boolean isSearchMatched) {
this.isSearchMatched = isSearchMatched;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Card card = (Card) o;
return Objects.equals(id, card.id) &&
Objects.equals(todo, card.todo) &&
Objects.equals(isSearchMatched, card.isSearchMatched);
}
@Override
public int hashCode() {
return Objects.hash(id, todo, isSearchMatched);
}
Адаптер списка
public class CardRVAdapter extends ListAdapter {
private String searchString = "";
public Spannable spannable;
private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() {
@Override
public boolean areItemsTheSame(Card oldItem, Card newItem) {
return oldItem.getId() == newItem.getId();
}
@Override
public boolean areContentsTheSame(Card oldItem, Card newItem) {
return oldItem.getTodo().equals(newItem.getTodo()) &&
oldItem.isSearchMatched() == (newItem.isSearchMatched());
}
};
public void setFilter(List newSearchList, String adapSearchText) {
if (newSearchList != null && !newSearchList.isEmpty()) {
this.searchString = adapSearchText.toLowerCase(Locale.US);
submitList(new ArrayList(newSearchList));
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView cardBlankText2; // displays text in the CardView and is matched against the user's search text input.
}
public ViewHolder(@NonNull final View itemView) {
super(itemView);
cardBlankText2 = itemView.findViewById(R.id.cardBlankText2);
}
void bindData(Card card, final int position) {
// Highlight matches from search characters is Green color.
if (searchString != null && !TextUtils.isEmpty(searchString)) {
String todoSearchHighlightFromVH = cardBlankText2.getText().toString().toLowerCase();
int offsetEnd2 = todoSearchHighlightFromVH.indexOf(searchString.toLowerCase(Locale.US));
final Spannable spannable2 = new SpannableString(cardBlankText2.getText());
spannable2.removeSpan(cardBlankText2);
cardBlankText2.setText(spannable2);
if (card.isSearchMatched()) {
for (int start2 = 0; start2 < todoSearchHighlightFromVH.length() && offsetEnd2 != -1; start2 = offsetEnd2 + 1) {
offsetEnd2 = todoSearchHighlightFromVH.indexOf(searchString.toLowerCase(Locale.US), start2);
if (offsetEnd2 == -1) {
break;
} else {
final ForegroundColorSpan foregroundColorSpan2 = new ForegroundColorSpan(Color.GREEN);
spannable2.setSpan(foregroundColorSpan2, offsetEnd2, offsetEnd2 + searchString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
cardBlankText2.setText(spannable2);
}
}
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Card card = getItem(position);
if (card != null) {
holder.bindData(card, position);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... istadapter
Android: исправление выделения текста поиска с помощью RecyclerView и ListAdapter ⇐ JAVA
Программисты JAVA общаются здесь
1729800548
Anonymous
У меня есть SearchView на панели инструментов, который находится над списком CardViews RecyclerView. SearchView работает правильно, фильтруя список на основе ввода текста. Однако код в ListAdapter в методе «onBindViewHolder()» для выделения текста поиска с помощью Color.GREEN для каждого CardView не работает.
Я установил логическое значение «isSearchMatched» это значение переключается на true, когда CardView содержит текст, соответствующий тексту SearchView. Затем я использую «isSearchMatched» в onBindViewHolder() плюс submitList() с новым ArrayList для ListAdapter, чтобы распознать изменение элементов CardView, чтобы можно было выделить текст поиска в CardView... безуспешно.Что мне здесь не хватает?
[b]MainActivity[/b]
mSearchView.setOnQueryTextListener() {
...
filter(newText)
}
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);
**cardItem.setSearchMatched(true);**
}
}
if (!searchList.isEmpty()) {
adapter.setFilter(searchList, searchText);
}
[b]Card.java[/b] // элемент модели
@Entity(tableName = "cards_table")
public class Card implements Parcelable {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "cardId")
public int id;
@ColumnInfo(name = "cardTodo")
private String todo;
@ColumnInfo(name = "cardMatchedSearchText")
private boolean isSearchMatched = false;
...
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(id);
parcel.writeString(todo);
parcel.writeByte((byte) (isSearchMatched ? 1 : 0));
}
private void readFromParcel(Parcel in) {
id = in.readInt();
todo = in.readString();
isSearchMatched = in.readByte() != 0;
}
public int getId() {
return this.id;
}
public String getTodo() {
return this.todo;
}
public boolean isSearchMatched() {
return this.isSearchMatched;
}
public void setId(int id) {
this.id = id;
}
public void setTodo(String todo) {
this.todo = todo;
}
public void setSearchMatched(boolean isSearchMatched) {
this.isSearchMatched = isSearchMatched;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Card card = (Card) o;
return Objects.equals(id, card.id) &&
Objects.equals(todo, card.todo) &&
Objects.equals(isSearchMatched, card.isSearchMatched);
}
@Override
public int hashCode() {
return Objects.hash(id, todo, isSearchMatched);
}
[b]Адаптер списка[/b]
public class CardRVAdapter extends ListAdapter {
private String searchString = "";
public Spannable spannable;
private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() {
@Override
public boolean areItemsTheSame(Card oldItem, Card newItem) {
return oldItem.getId() == newItem.getId();
}
@Override
public boolean areContentsTheSame(Card oldItem, Card newItem) {
return oldItem.getTodo().equals(newItem.getTodo()) &&
oldItem.isSearchMatched() == (newItem.isSearchMatched());
}
};
public void setFilter(List newSearchList, String adapSearchText) {
if (newSearchList != null && !newSearchList.isEmpty()) {
this.searchString = adapSearchText.toLowerCase(Locale.US);
submitList(new ArrayList(newSearchList));
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView cardBlankText2; // displays text in the CardView and is matched against the user's search text input.
}
public ViewHolder(@NonNull final View itemView) {
super(itemView);
cardBlankText2 = itemView.findViewById(R.id.cardBlankText2);
}
void bindData(Card card, final int position) {
// Highlight matches from search characters is Green color.
if (searchString != null && !TextUtils.isEmpty(searchString)) {
String todoSearchHighlightFromVH = cardBlankText2.getText().toString().toLowerCase();
int offsetEnd2 = todoSearchHighlightFromVH.indexOf(searchString.toLowerCase(Locale.US));
final Spannable spannable2 = new SpannableString(cardBlankText2.getText());
spannable2.removeSpan(cardBlankText2);
cardBlankText2.setText(spannable2);
if (card.isSearchMatched()) {
for (int start2 = 0; start2 < todoSearchHighlightFromVH.length() && offsetEnd2 != -1; start2 = offsetEnd2 + 1) {
offsetEnd2 = todoSearchHighlightFromVH.indexOf(searchString.toLowerCase(Locale.US), start2);
if (offsetEnd2 == -1) {
break;
} else {
final ForegroundColorSpan foregroundColorSpan2 = new ForegroundColorSpan(Color.GREEN);
spannable2.setSpan(foregroundColorSpan2, offsetEnd2, offsetEnd2 + searchString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
cardBlankText2.setText(spannable2);
}
}
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Card card = getItem(position);
if (card != null) {
holder.bindData(card, position);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79041428/android-fix-search-text-highlighting-with-recyclerview-and-listadapter[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия