Cloud Firestore OR과 LIKE를 제공하지 않는다. 직접 코드로 구현해야 한다.
1.검색
//검색 EditText
read_database_activity_edittext.addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(p0: Editable?) {
searchList(p0.toString())
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
})
2.LIKE
fun searchList(filterString:String){
//userDTO.name안에 filterString글자가 있을 때 아이템을 filterList에 담겠다 (filter문)
var filterList = listForFilter!!.filter { userDTO ->
userDTO.name!!.contains(filterString)
}
getArrayList.clear()
getArrayList.addAll(filterList)
// getArrayList = filterList as ArrayList<UserDTO> 윗 두줄 대신 이렇게 입력하면
// getArrayList의 주솟값이 변하게 되면서 위쪽의 어댑터가 정상적으로 참조하지 못하게 됨
recyclerview_read_database.adapter.notifyDataSetChanged()
}
Filter문 설명(for 문에 필터 걸기)
for 문에 필터를 걸 수 있습니다.
kotlin에서는 filter
라는 키워드를 제공하고 있지만, Java에서는 filter를 다음과 같이 구현할 수 있습니다.
5보다 큰 int에 대해서 *2
를 처리하고, 이를 출력하는 코드입니다.
for (Integer integer : list) {
if (integer > 5) {
integer *= 2;
Log.e("TAG", "Index " + integer);
}
}
위의 코트를 Kotlin의 람다식을 함께 사용하면 아래와 같이 정의할 수 있습니다.
filter
에서 5 보다 큰 값을 핕터링 하게 되면, map
키워드에서 검출된 결과만 확인이 가능하며, 이를 출력하게 되는 코드로 Java와 똑같지만 filter
가 if 문을 대체하게 됩니다.
list.filter { it > 5 }.map { Log.d("TAG", "index " + (it * 2)) }
filter 원문 코드는 다음과 같습니다.
/**
* Returns a list containing only elements matching the given [predicate].
*/
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
map 원문 코드는 다음과 같습니다.
/**
* Returns a list containing the results of applying the given [transform] function
* to each element in the original collection.
*/
@Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE")
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}
람다설명: https://academy.realm.io/kr/posts/kotlin-2/
2.OR구현
String.split("문자열")하면 문자열을 기준으로 배열에 저장된다.
//검색 EditText
read_database_activity_edittext.addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(p0: Editable?) {
searchList(p0.toString())
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
})
}
fun searchList(filterString:String){
//userDTO.name안에 filterString글자가 있을 때 아이템을 filterList에 담겠다 (filter문)
var filterList = listForFilter!!.filter { userDTO ->
checkCharacter(userDTO.name!!, filterString)
}
getArrayList.clear()
getArrayList.addAll(filterList)
recyclerview_read_database.adapter.notifyDataSetChanged()
}
fun checkCharacter(name:String, searchString:String) : Boolean{
var array = searchString.split(" ")
for(item in array){
if(name.contains(item)){
return true
}
}
return false
}
userDTO -> checkCharacter(userDTO.name!!, filterString)
-> 람다가 if문처럼 쓰이는건가? 헷갈림...
'Android > Firebase' 카테고리의 다른 글
Google Auth (0) | 2019.01.30 |
---|---|
Android에 Firebase 파일 추가 (0) | 2019.01.08 |
[Firebase] CloudStore 복합쿼리 (0) | 2018.08.01 |
[Firebase] Cloud Firestore 데이터 읽기 (0) | 2018.08.01 |
[Firebase] Cloud Firestore 데이터입력 (0) | 2018.07.30 |