식별 가능한 데이터 개체 작업

식별 가능성은 개체가 데이터 변경에 관해 다른 개체에 알릴 수 있는 기능을 의미합니다. 데이터 결합 라이브러리를 통해 개체, 필드 또는 컬렉션을 식별 가능하게 만들 수 있습니다.

간단한 기존 개체를 데이터 결합에 사용할 수는 있지만 개체를 수정해도 UI가 자동으로 업데이트되지 않습니다. 데이터 결합을 사용하면 데이터 변경 시 리스너라는 다른 개체에 알리는 기능을 데이터 개체에 제공할 수 있습니다. 식별 가능한 클래스에는 세 가지 유형, 즉 개체, 필드컬렉션이 있습니다.

식별 가능한 데이터 개체 중 하나가 UI에 결합되고 데이터 개체의 속성이 변경되면 UI가 자동으로 업데이트됩니다.

식별 가능한 필드

일부 작업은 Observable 인터페이스를 구현하는 클래스를 생성하는 작업과 관련이 있지만 클래스에 몇 가지 속성만 있다면 그다지 애쓸 필요가 없습니다. 이러한 상황에서는 일반 Observable 클래스 및 다음과 같은 프리미티브(Primitive) 관련 클래스를 사용하여 필드를 식별 가능하게 만들 수 있습니다.

식별 가능한 필드는 단일 필드가 있는 독립적인 식별 가능한 개체입니다. 프리미티브 버전은 액세스 작업 중에 박싱 및 언박싱을 방지합니다. 이 메커니즘을 사용하려면 다음 예에서와 같이 자바 프로그래밍 언어로 public final 속성을 생성하거나 Kotlin으로 읽기 전용 속성을 생성해야 합니다.

Kotlin

    class User {
        val firstName = ObservableField<String>()
        val lastName = ObservableField<String>()
        val age = ObservableInt()
    }

    

자바

    private static class User {
        public final ObservableField<String> firstName = new ObservableField<>();
        public final ObservableField<String> lastName = new ObservableField<>();
        public final ObservableInt age = new ObservableInt();
    }

    

필드 값에 액세스하려면 다음과 같이 set()get() 접근자 메서드를 사용해야 합니다.

Kotlin

    user.firstName = "Google"
    val age = user.age

    

자바

    user.firstName.set("Google");
    int age = user.age.get();

    

식별 가능한 컬렉션

일부 앱은 동적 구조를 사용하여 데이터를 보유합니다. 식별 가능한 컬렉션을 통해 키를 사용하여 이러한 구조에 액세스할 수 있습니다. 다음 예에서와 같이 키가 String과 같은 참조 유형일 때에는 ObservableArrayMap 클래스가 유용합니다.

Kotlin

    ObservableArrayMap<String, Any>().apply {
        put("firstName", "Google")
        put("lastName", "Inc.")
        put("age", 17)
    }

    

자바

    ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
    user.put("firstName", "Google");
    user.put("lastName", "Inc.");
    user.put("age", 17);

    

다음과 같이 레이아웃에서 문자열 키를 사용하여 맵을 찾을 수 있습니다.

<data>
        <import type="android.databinding.ObservableMap"/>
        <variable name="user" type="ObservableMap<String, Object>"/>
    </data>
    …
    <TextView
        android:text="@{user.lastName}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:text="@{String.valueOf(1 + (Integer)user.age)}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

다음과 같이 키가 정수일 때에는 ObservableArrayList 클래스가 유용합니다.

Kotlin

    ObservableArrayList<Any>().apply {
        add("Google")
        add("Inc.")
        add(17)
    }

    

자바

    ObservableArrayList<Object> user = new ObservableArrayList<>();
    user.add("Google");
    user.add("Inc.");
    user.add(17);

    

다음 예에서와 같이 레이아웃에서 색인을 통해 목록에 액세스할 수 있습니다.

<data>
        <import type="android.databinding.ObservableList"/>
        <import type="com.example.my.app.Fields"/>
        <variable name="user" type="ObservableList<Object>"/>
    </data>
    …
    <TextView
        android:text='@{user[Fields.LAST_NAME]}'
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

식별 가능한 개체

Observable 인터페이스를 구현하는 클래스를 사용하면 식별 가능한 개체의 속성 변경에 관해 알림을 받으려는 리스너를 등록할 수 있습니다.

Observable 인터페이스에 리스너를 추가 및 삭제하는 메커니즘이 있지만 알림이 전송되는 시점은 개발자가 직접 결정해야 합니다. 더 쉽게 개발할 수 있도록 데이터 결합 라이브러리는 리스너 등록 메커니즘을 구현하는 BaseObservable 클래스를 제공합니다. BaseObservable을 구현하는 데이터 클래스는 속성이 변경될 때 알리는 역할을 합니다. 다음 예에서와 같이 Bindable 주석을 getter에 할당하고 setter의 notifyPropertyChanged() 메서드를 호출함으로써 이 작업을 완료합니다.

Kotlin

    class User : BaseObservable() {

        @get:Bindable
        var firstName: String = ""
            set(value) {
                field = value
                notifyPropertyChanged(BR.firstName)
            }

        @get:Bindable
        var lastName: String = ""
            set(value) {
                field = value
                notifyPropertyChanged(BR.lastName)
            }
    }
    

자바

    private static class User extends BaseObservable {
        private String firstName;
        private String lastName;

        @Bindable
        public String getFirstName() {
            return this.firstName;
        }

        @Bindable
        public String getLastName() {
            return this.lastName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
            notifyPropertyChanged(BR.firstName);
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
            notifyPropertyChanged(BR.lastName);
        }
    }

    

데이터 결합은 데이터 결합에 사용된 리소스의 ID를 포함하는 모듈 패키지에 이름이 BR인 클래스를 생성합니다. Bindable 주석은 컴파일하는 동안 BR 클래스 파일에 항목을 생성합니다. 데이터 클래스의 기본 클래스를 변경할 수 없으면 PropertyChangeRegistry 개체를 사용하여 Observable 인터페이스를 구현함으로써 효율적으로 리스너를 등록하고 리스너에 알림을 제공할 수 있습니다.

참고 자료

데이터 결합에 관해 자세히 알아보려면 다음 참고 자료를 참조하세요.

샘플

Codelab

블로그 게시물