Android: исправление выделения текста поиска с помощью RecyclerView и ListAdapterJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Android: исправление выделения текста поиска с помощью RecyclerView и ListAdapter

Сообщение Anonymous »

У меня есть 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»