SearchView - onQueryTextChange를 이용한 검색 기능과, 검색어의 변화를 감지해서 이벤트를 처리할 수 있습니다.
Progress
with(binding) {
communityMainSearchView.setOnQueryTextListener(object :
androidx.appcompat.widget.SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
query?.let {
commuViewModel.getFilteredBoard(query)
}
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
CoroutineScope(Dispatchers.Main).launch{
if(newText == ""){
commuViewModel.getAllBoards()
}
}
return false
}
})
}
1. setOnQueryTextListener : SearchView에대한 이벤트 리스너입니다.
2. onQueryTextListener : 텍스트 입력 및 검색을 처리하기위한 리스너(인터페이스) 입니다.
fun getFilteredBoard(query:String){
val allList = _boards.value
val filteredList = allList?.filter { it?.title?.contains(query) == true || it?.content?.contains(query) == true }
filteredList?.let {
_filteredBoards.value = it
}
}
3. onQueryTextSubmit : 검색어를 입력하고 동작을 처리합니다.
- 위에서 검색어(query)를 viewModel에 넣어서 검색 결과를 받아옵니다.
- 검색어(query)를 이용해서 모든 게시글을 불러온 후 contains를 이용해서 게시글의 제목이나 내용에 검색어(query)가
포함된 목록만 filteredList에 담아줍니다.
- 검색결과를 라이브데이터에 넣어서 관리합니다.
suspend fun getAllBoards() {
getAllBoardsUseCase.invoke().collect() {
_boards.value = it.toEntity()
}
}
4. onQueryTextChange : 검색어의 변경을 감지하고, 이벤트를 처리합니다.
- 빈칸일때 viewModel에 넣어서 모든데이터를 받아오도록 처리했습니다.
- getAllBoardUseCase : 모든 게시글을 불러오는 UseCase입니다.
- Flow를 이용했기때문에 collect()함수를 이용해서 데이터를 받습니다.
- 받아온데이터를 라이브데이터를 이용해서 관리합니다.
Result
onQueryTextChange를 이용해서
- 검색어를 실시간으로 감지할 수 있기때문에 원하는 이벤트를 처리할 수 있습니다.
- 위에서는 빈칸일때 모든 게시글이 나오도록 했지만, 실시간으로 검색어를 감지해서 검색버튼을 누르지 않고도 실시간으로 검색할 수 있고 유용하게 사용할 수 있습니다.
썸네일 출처
'TIL, WIL(일기)' 카테고리의 다른 글
231113 [Trouble Shooting] 구글스토어 배포(앱 상태 : 거부됨) (0) | 2023.11.13 |
---|---|
231109 구글 스토어 앱 업데이트 하기 (0) | 2023.11.09 |
231107 Return Method (0) | 2023.11.07 |
231106 [Trouble Shooting] ListAdapter 갱신 이슈 (0) | 2023.11.06 |
231104 오늘의 억까 (0) | 2023.11.04 |