본문 바로가기

Dailycoding/Android

Data Binding

결과화면

 

파일구조

 

1. 빌드 환경
2. 레이아웃 및 바인딩 수식

 

 

1. 빌드 환경

    buildFeatures {
        dataBinding = true
    }

 

 

2. 레이아웃 및 바인딩 수식 

일반 레이아웃을 데이터 바인딩 레이아웃으로 변환하려면:
1. 레이아웃을 <layout>태그 로 감싸세요
2. 레이아웃 변수 추가(선택 사항)
3. 레이아웃 표현식 추가(선택 사항)
- 레이아웃 표현식은 @ 기호로 시작하고 중괄호 { }로 묶습니다.

 

activity_main.xml

<?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>

        <!-- 1. 일반적인 바인딩-->
        <variable
            name="firstName"
            type="String" />

        <variable
            name="lastName"
            type="String" />

        <!-- 2. data 바인딩-->
        <variable
            name="user"
            type="com.project.practice.User" />

        <!-- 3. ViewModel 바인딩-->
        <variable
            name="viewModel"
            type="com.project.practice.SimpleViewModel" />

        <!-- 4. RecyclerView 바인딩-->
        <variable
            name="mainAdapter"
            type="com.project.practice.MainAdapter" />

    </data>

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{firstName}"
            android:textSize="30sp"
            tools:text="홍" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{lastName}"
            android:textSize="30sp"
            tools:text="길동" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"
            android:textSize="30sp"
            tools:text="홍" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"
            android:textSize="30sp"
            tools:text="길동" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.username}"
            android:textSize="30sp"
            tools:text="liveData 값" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text='@{"좋아요 수: " + (viewModel.likeCnt != null ? String.valueOf(viewModel.likeCnt) : "0")}'
            android:textSize="30sp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{() -> viewModel.onLike()}"
            android:text="좋아요" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:adapter="@{mainAdapter}"
            android:layout_marginTop="20dp" />

    </androidx.appcompat.widget.LinearLayoutCompat>

</layout>

 

 

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    private val viewModel: SimpleViewModel by viewModels()
    private lateinit var adapter: MainAdapter

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

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

        // 1. 일반적인 바인딩
        binding.firstName = "홍"
        binding.lastName = "길동"

        // 2. data 바인딩
        binding.user = User("Hong", "Gil-dong")

        // 3. ViewModel 바인딩
        binding.lifecycleOwner = this
        binding.viewModel = viewModel
        viewModel.setUsername("이순신")

        // 4. RecyclerView 바인딩
        adapter = MainAdapter()
        binding.mainAdapter = adapter
        binding.recyclerViewMain.layoutManager = LinearLayoutManager(this)

        val items = List(20) { "${it + 1}번째 아이템" }
        adapter.submitList(items)
    }

}

 

 

User.kt

data class User(val firstName: String, val lastName: String)

 

 

SimpleViewModel.kt

class SimpleViewModel : ViewModel() {

    private val _username = MutableLiveData<String>()
    val username: LiveData<String> get() =  _username

    private val _likeCnt = MutableLiveData(0)
    val likeCnt: LiveData<Int> get() =  _likeCnt

    fun setUsername(name: String) {
        _username.value = name
    }

    fun onLike() {
        _likeCnt.value = _likeCnt.value?.plus(1) ?: 0
    }

}

 


MainAdapter.kt

class MainAdapter : ListAdapter<String, MainAdapter.ViewHolder>(diffUtil) {

    inner class ViewHolder(private val binding: ItemMainBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(string: String) {
            // data binding 사용
            binding.itemText = string
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemMainBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(item)
    }

    companion object {
        val diffUtil = object : DiffUtil.ItemCallback<String>() {
            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }

        }
    }

}

 

 

item_main.xml

<?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="itemText"
            type="String" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textView_main_item"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:textSize="30sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:text="@{itemText}"
            tools:text="1번째 아이템" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 


 

참조

 

 

데이터 바인딩 라이브러리  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소 데이

developer.android.com

 

 

Data Binding in Android  |  Android Developers

In this codelab you’ll learn how to use the Data Binding library. The Data Binding Library allows you to bind UI components in your layouts to data sources in your app using a declarative format rather than programmatically. You’ll learn to set it all

developer.android.com