Android:使用 RecyclerView 和 ListAdapter 解决 ForegroundColorSpan 搜索文本突出显示问题
在 RecyclerView 中突出显示搜索文本可能具有挑战性,尤其是在使用 ListAdapter 时。为了解决这个问题,让我们探索一个潜在的解决方案,以确保使用自定义 ListAdapter 正确突出显示搜索文本。
使用 SubmitList() 更新 ListAdapter 中的数据集时会出现问题。虽然它确实从列表中正确删除了项目,但它无法触发现有项目的 onBindViewHolder(),因为它们的数据保持不变。这会导致这些项目的突出显示机制无法按预期工作。
解决方案:
要解决此问题,我们需要修改过滤逻辑以创建新卡片具有更新的搜索字符串的模型,而不是就地修改现有模型。以下是 MainActivity 中修改后的代码:
private void filter(String searchText) { ArrayList<Card> searchList = new ArrayList<>(); for (Card cardItem : mCards) { if (cardItem.getTodo().toLowerCase().contains(searchText.toLowerCase(Locale.US))) { Card updatedCard = new Card(cardItem.getTodo(), searchText); searchList.add(updatedCard); } } if (!searchList.isEmpty()) { adapter.setFilter(searchList); }
通过使用更新的搜索字符串创建新的 Card 实例,我们强制 ListAdapter 为受影响的项目触发 onBindViewHolder(),确保突出显示机制正常工作。
更新了 ListAdapter:
在 ListAdapter 中,我们删除了searchString 属性,因为它不再是必要的。相反,搜索字符串信息包含在 Card 模型中。现在,bindData() 方法应如下所示:
void bindData(Card card) { 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 (card.getSearchText() != null) { int start = cardBlankText2.getText().toString().toLowerCase(Locale.US).indexOf(card.getSearchText().toLowerCase(Locale.US)); int end = start + card.getSearchText().length(); if (start != -1) { spannable.setSpan(getFCS(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } cardBlankText2.setText(spannable, TextView.BufferType.SPANNABLE); } }
通过这些更改,搜索文本突出显示功能应在 RecyclerView 中按预期工作,确保每次出现的搜索字符串都正确突出显示。
以上是如何使用 ListAdapter 修复 RecyclerView 中的 ForegroundColorSpan 搜索文本突出显示问题?的详细内容。更多信息请关注PHP中文网其他相关文章!