Nuke Olaf - Log Store

[Android] 안드로이드 - 고차함수 사용하여 SearchView BindingAdpater 만들기 (feat. dataBinding) 본문

Android

[Android] 안드로이드 - 고차함수 사용하여 SearchView BindingAdpater 만들기 (feat. dataBinding)

NukeOlaf 2020. 5. 4. 06:32

SearchView 에 setOnQueryListener 를 BindingAdpater 로 달아줄 수 있다.

interface 로 setOnQueryListener 리스너 객체를 전달하여 BindingAdapter 를 만들수도 있지만, 코틀린은 함수형 언어인 만큼 고차함수를 사용하여 만들어보도록 하자.

1. activity_main.xml (constraint 는 코드량이 많아서 linear 로 만들었다)

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="activity"
            type="com.olaf.nukeolaf.MainActivity" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ui.MainActivity">

        <androidx.appcompat.widget.SearchView
            android:id="@+id/search_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:iconifiedByDefault="false"
            app:queryHint="검색어를 입력하시오"
            app:setOnQueryTextListener="@{activity.searchMovie}" />

    </LinearLayout>
</layout>

 

2. MainActivity.kt

package com.olaf.nukeolaf

class MainActivity : AppCompatActivity() {

    val searchMovie = { query: String? ->
        // 검색하는 코드 작성...
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(
            this,
            R.layout.activity_main
        )
        binding.activity = this

    }

}

 

3. BindingAdapter.kt

@BindingAdapter("setOnQueryTextListener")
fun setOnQueryTextListener(view: SearchView, searchMovie: (String?) -> Unit) {
    view.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            searchMovie(query)
            return false
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            return false
        }
    })
}

 

참고 사이트 >>>

https://myung6024.tistory.com/100

Comments