룬아님의 취중코딩

SearchView and Databinding with high order function 본문

개발/안드로이드 개발

SearchView and Databinding with high order function

룬아님 2019. 10. 28. 23:09

SearchView를 Databinding 하기 위해 bindingAdapter를 구현하고 리스너를 구현하기 위해 함수를 인자로 넘겨주는 방법을 소개한다.

이 코드의 목적은 활성화 된 SearchView에 값을 입력하고 키보드의 검색 버튼을 눌렀을 때 자신이 원하는 함수를 호출하도록 하는 것이다.

 

1. SearchFragment.kt

val searchRepositoryByKeyWord = fun(searchKeyWord: String) {
    CoroutineScope(Dispatchers.Main).launch {
        val result = searchRepositoriesUseCase(searchKeyWord)
        if (result is Success) {
            _items.value = result.data.repositories
        }
    }
}

고차함수로 사용하기 위한 함수를 선언한다. 해당 함수는 searchKeyWord를 인자로 받아 해당 키워드로 검색한 결과를 리스트 아이템에 삽입해주는 기능을 한다.

 

2. SearchListBinding.kt

@BindingAdapter("app:setOnQueryTextListener")
fun setOnQueryTextListener(searchView: SearchView, searchByKeyWord: (String) -> Unit) {
    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextChange(newText: String?): Boolean {
            return false
        }

        override fun onQueryTextSubmit(query: String?): Boolean {
            query?.let { keyWord ->
                searchByKeyWord(keyWord)
            }
            return false
        }
    })
}

BindingAdapter를 만들어준다. 함수를 인자로 받아 setOnQueryTextListener의 onQueryTextSubmit이 호출 될때에 해당 keyWord로 인자로 받은 함수를 실행시키는 고차함수다.

 

3. search_fragment.xml

<androidx.appcompat.widget.SearchView
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   app:iconifiedByDefault="false"
   app:setOnQueryTextListener="@{fragment.searchRepositoryByKeyWord}" />

iconifiedByDefault를 false로 하게 되면 아이콘화 되지 않고 항상 확장되어 있는 상태가 된다.
또한 아까 구현한 BindingAdapter를 이용하여 SearchFragment에서 만들어 두었던 searchRepositoryByKeyWord 함수를 인자로 넘겨주면 Databinding을 이용하여 SearchView의 setOnQueryTextListener을 구현하고 원하는 함수를 넘겨서 호출할 수 있다.

반응형
Comments