๐Ÿ’ป ๊ฐœ๋ฐœ์ฐจ๊ธฐ ๐Ÿฅ‹ feat.Android

Databinding ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€๊ณตํ• ๊นŒ? ๐Ÿฝ ๋ณธ๋ฌธ

Development/Android

Databinding ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€๊ณตํ• ๊นŒ? ๐Ÿฝ

Android_DevKick 2022. 9. 18. 01:00

Databinding์„ ์‚ฌ์šฉ ํ•˜๊ณ ์žˆ์–ด! ๋˜ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์“ฐ๋Š”์ง„ ์•Œ๊ฒ ์–ด.

๊ทผ๋ฐ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ฐ€๊ณตํ•ด์„œ ๋ฐ”๋กœ ์จ?

์‹œ๊ฐ„์ด๋‚˜ ํšŸ์ˆ˜ ๋ญ ํ•˜๋ฌผ๋ฉฐ ์‚ฌ์šฉ์ž ์„ฑ๋ณ„์ด๋ผ๋„ ๊ฐ€๊ณตํ•ด์„œ ๋ณด์—ฌ์ค˜์•ผํ•˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?

๊ทธ๋Ÿผ ๋˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฃผ์ž…ํ•ด์ค˜์•ผํ•˜๋Š”๊ฑฐ ์•„๋‹ˆ์•ผ?

๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ… ์•„~์ฃผ ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.(์ด๋Ÿฌ๋ฉด ๋’ท๋ง์ด ๊ถ๊ธˆํ•ด์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ํž˜๋“ค๋‹ค ๐Ÿคฆ‍โ™‚๏ธ)

 

1. ์ผ๋‹จ ์‚ฌ์šฉํ•  Data class๋ฅผ ๋งŒ๋“ ๋‹ค.

data class Memo(
// @SerializedName("id") <- ์„œ๋ฒ„์—์„  ์ด ์ด๋ฆ„์œผ๋กœ ๋ฐ›์•„์˜ค๊ฒŒํ•˜๊ณ 
// ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์•„๋ž˜์— ์ •ํ•œ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
โ€‹
// @Expose => object ์ค‘ ํ•ด๋‹น ๊ฐ’์ด null ๊ฒฝ์šฐ
// -> json ์œผ๋กœ ๋งŒ๋“ค ํ•„๋“œ๋ฅผ ์ž๋™ ์ƒ๋žต
    @SerializedName("id")
    @Expose val id: Int,
โ€‹
    @SerializedName("title")
    @Expose val memoTitle: String,
โ€‹
    @SerializedName("content")
    @Expose val memoContent: String,
)

 

 

2. BaseObserverable์„ ์ƒ์†๋ฐ›๋Š”๋‹ค.

data class Memo(
    ...
    @SerializedName("content")
    @Expose val memoContent: String,
): BaseObservable() {
โ€‹
}

 

3. ์•ˆ์—์„œ ๊ฐ€๊ณตํ•  ์ฝ”๋“œ๋ฅผ ์ ๋Š”๋‹ค.

data class Memo(
    @SerializedName("id")
    @Expose val id: Int,
โ€‹
    @SerializedName("title")
    @Expose val memoTitle: String,
โ€‹
    @SerializedName("content")
    @Expose val _memoContent: String, // (1)
): BaseObservable() {

  @get:Bindable
  val memoContent: String // (2)
      get() {
          val memo = "๋ฉ”๋ชจ ์ƒ์„ธ๋‚ด์šฉ : ${_memoContent}"
          return memo
      }
      
}

์œ„์— (1) ์„ ๋ณด๋ฉด ์›๋ž˜ ์‚ฌ์šฉํ•˜๋˜ memoContent ๋ณ€์ˆ˜๋ช… ์•ž์— _๊ฐ€ ๋ถ™์–ด์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

(2)์—์„œ ๋˜‘๊ฐ™์€ ๋ณ€์ˆ˜๋ช…์„ ์“ฐ๊ณ  ์žˆ๋Š”๋ฐ ์ด์œ ๋Š” ๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€๊ณตํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด _๋ฅผ ๋ถ™์ด๊ณ  ๊ตฌ๋ถ„์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ€์ˆ˜๋ช…์€ ๋˜‘๊ฐ™์ง€๋งŒ _๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

 

4. ์ด์ œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

<?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="item"
            type="com.example.project.models.Memo" />
    </data>
โ€‹
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
โ€‹
            <TextView
                android:id="@+id/tv_memo"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:fontFamily="@font/noto_medium"
                android:text="@{item.memoContent}"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
...

์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜๋ฉด

_memoContent์˜ ๊ฐ’์€ -> "๋ฉ”์—๋ชจ์˜ค". ๋ผ๋ฉด
memoContent์˜ ๊ฐ’์€ -> "๋ฉ”๋ชจ ์ƒ์„ธ๋‚ด์šฉ : ๋ฉ”์—๋ชจ์˜ค" ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๋„์

 

์œ„์—์„œ๋Š” ๊ฐ„๋‹จํ•œ String ์ž‘์—…์„ ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„ ๊ด€๋ฆฌ ํ‘œ์‹œ๋ผ๋˜์ง€ Model๊ฐ„ ์œ ๊ธฐ์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

Data class ์•ˆ์— BaseObserverable ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด xml์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ •๋ง ํŽธํ•˜๊ณ  ๊น”๋”ํ•ด์ง€๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๊ธฐ๋ถ„์ด ๋”ํ•  ๊ฒƒ ์—†์ด ์ข‹๋‹ค. ํํํํซ