> For the complete documentation index, see [llms.txt](https://progjh.gitbook.io/today-i-learned/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://progjh.gitbook.io/today-i-learned/root/android/databinding.md).

# Databinding

## observableField.set() 메소드 호출 후, notify 가 안되는 이슈

observableField 의 set 메소드를 이용하여 데이터를 전달했음에도 불구하고 가끔 정상적으로 전달되지 않는 이슈가 있었음.

이유는 set 메소드 내부구에서 이전에 전달되었던 데이터와 **같은 경우** notify 를 호출하지 않음.  따라서  set  호출 이후에  명시적으로  notifyChange()  를 호출해주면  정상적으로  전달됨 .&#x20;

```
observableField.set(data);
observableField.notifyChange();
```

## executePendingBindings()

강제로 바인딩되어있는 데이터들을 이용하여 View 를 갱신한다. 보통 recyclerView 에서 많이 사용함. 결국 UI thread 에 view set 테스트가 쌓이는 것이므로 너무 많이 호출돼면 퍼포먼스 이슈 생길 수 있음.

## bindingAdapter 와 콜백

1. 메소드 시그니쳐를 그대로 맞춰서 전달.

```
@{viewModel::onChange}
```

2\. 해당 콜백의 구현체를 넘겨줌

```
@{Listener}
```

3\. 람다식 이용

```
@{param -> viewModel.onChange(param)}
```

이때 인자는 1개만 가능하다.

## custom BindingAdapter 만들시 주의사항

* BindinAdapter 메소드의 첫번째 인자는 항상 View 타입이어야 한다.

## \<merge>

레이아웃 최상위 레벨에서 \<merge> 를 사용하고 데이터바인딩 적용시 inflate 과정에서 에러. 개발자 가이드에서도 사용하지 말라고 나와있음. 이유는 좀 더 찾아볼 것&#x20;

## \<include>

```
<OuterView>

    <include/>

</OuterView>
```

이러한 구조의 View 가 있을 때 Outer depth 에서 include 의 View 에 정의된 데이터를 넘겨주고 싶을 경우 `bind:` 활용할 것

이때 bind 에 들어가는 이름은 반드시 include 에서 지정한 variable name 과 일치해야함.

## String format&#x20;

```markup
// strings.xml
<string name="user_list_title">참여유져 %d</string>

// activity.xml
<TextView
    android:text="@{@string/user_list_title(viewModel.userCount)}"/>
```
