고려해야할점
1. 검색어는 여러개 있을 수 있다.
2. Spannable 처리
val (keyword, posts) = from
val pattern = Pattern.compile("($keyword)")
return posts.map { post ->
val result = pattern.matcher(post.description)
val content = SpannableStringBuilder()
var start = 0
while (result.find()) {
content.color(resourceProvider.getColor(R.color.black_4)) {
append(post.description, start, result.start())
}
content.color(resourceProvider.getColor(R.color.dusty_orange)) {
append(post.description, result.start(), result.end())
}
start = result.end()
}
content.append(post.description, start, post.description.length)
}
삽질 기록
if (result.find()) {
for (i in 0 until result.groupCount()) {
content.color(resourceProvider.getColor(R.color.black_4)) {
append(post.description, start, result.start(i))
}
end = result.end(i)
content.color(resourceProvider.getColor(R.color.dusty_orange)) {
append(post.description, result.start(i), end)
}
start = end
}
}
-> for문으로 접근해서 인덱스로써 접근 불가능.
start(0), start(1) 이렇게 해도 같은 결과값 나옴.
Matcher의 find() 가 이렇게 구현 되어있음.
public boolean find() {
int nextSearchIndex = this.last;
if (nextSearchIndex == this.first) {
++nextSearchIndex;
}
if (nextSearchIndex < this.from) {
nextSearchIndex = this.from;
}
if (nextSearchIndex <= this.to) {
return this.search(nextSearchIndex);
} else {
for(int i = 0; i < this.groups.length; ++i) {
this.groups[i] = -1;
}
return false;
}
}
last 라는 Matcher 클래스의 전역변수를 내부적으로 이용함 ( 포인터 )
-> find() 를 호출해야 다음 항목으로 접근가능