얼마전 실시간 채팅 앱 개발을 하다가 만난 문제이다.
"firebase realtime database의 데이터를 keyword로 검색하게 해주세요"
기존 코드는 FirebaseRecyclerviewAdapter를 사용해서 구현해두었기 때문에 firebase ui api를 사용해서 구현하면 될 것 같았다.
하지만? equalTo, startXXX, startAfterXXX 이런 api만 제공했기에 내가 원하는 동작 구현이 되지 않았다.
구선생님의 도움을 받아 이것저것 찾아봤지만 답을 찾지 못했고, 결국 그냥 snapshot에서 keyword로 필터링하는 방식으로 구현했다.
이게 최선일까?ㅠㅠㅠ
아무튼!
firebaseRef.addValueEventListener(object :ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
Log.d(TAG,"onchanged ${snapshot.value}")
val list = arrayListOf<RoomInfo>()
for (itemSnapshot in snapshot.children) {
val dataClass = itemSnapshot.child("roomInfo").getValue(RoomInfo::class.java)
if (dataClass != null && (viewModel.keyword.value.isNullOrBlank() || dataClass.name?.contains(viewModel.keyword.value?:"")?:false)) {
dataClass.let {
list.add(it)
}
}
}
viewModel.setRooms(list)
adapter.submitList(list)
}
mBinding.search.setOnQueryTextListener(object : SearchView.OnQueryTextListener,
androidx.appcompat.widget.SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(p0: String?): Boolean {
Log.d(LLog.TAG,"onQueryTextSubmit ${p0}")
return false
}
override fun onQueryTextChange(p0: String?): Boolean {
Log.d(TAG,"onQueryTextChange ${p0}")
if ((p0?:"").isEmpty()) adapter.submitList(viewModel.rooms.value)
else adapter.submitList(viewModel.rooms.value?.filter { it.name?.lowercase()?.contains(p0?.lowercase() ?: "") ?: false })
return true
}
})
}
이렇게 구현했는데, 다른방법도 계속 생각해봐야겠다😂
아 그리고 추가로 검색컴포넌트 구현할 때 icon이 왼쪽에 있어서 어떻게 옮길까 했는데
android:layoutDirection="rtl"
로 한번에 해결됐다,,
또 searchview로 검색창 구현을 했는데, 기본값이 collaped여서 아이콘을 클릭해야 검색어 입력을 할 수 있어서
android:iconifiedByDefault="false"
로 항상 펼쳐져 있게 설정했다.