0

안드로이드 데이터 바인딩은 흥미로운 도구이지만, 안드로이드의 (지나치게) 복잡한 아키텍처와는 잘 매치되지 않습니다. 많은 예제 또는 자습서에서는 분명히 작동하는 몇 가지 기본 시나리오 만 표시하지만 상황이 어려워 질 때 문제가 발생합니다.안드로이드 데이터 바인딩 의심

예 : 많은보기 (예 : RecyclerView 또는 ViewPager)에는 컨텍스트가 필요한 어댑터 또는 데코레이터가 필요하며 컨텍스트를 모든 ViewModel에 전달하는 것이 레이어 분리를 손상시키기 때문에 잘못된 것으로 보입니다.

ViewFlipper : ViewModel의 속성을 바인딩하여 다음 또는 이전을 어떻게 보이나요?

어떻게 RecyclerView를 LinearLayout, ItemAnimation 및 ItemDecoration으로 바인딩하겠습니까? 직장에서 Android Data Binding의 실제 사례를 보여줄 수 있습니까?

+1

왜 당신은'문맥을 통과해야합니다 :

나는 이미 세터가 있기 때문에 당신이 속성을 사용하는 특별한 BindingAdapter 필요하지 않습니다하지만, 그 또한 ItemAnimator에 대한 귀하의 질문에 대답해야 기대 'RecyclerView'를 사용할 때? – pskink

+0

귀하의 질문은 일반적인 것입니다. 대답을하기 위해 전체 에세이가 필요하지 않도록 조금 더 구체적으로 지정할 수 있습니까? – tynn

+0

[This (http://saulmm.github.io/from-design-to-android-part1)는 간단한 바인딩 이상을 다루는 예제 일 수 있습니다. 'ViewFlipper'도 있습니다. – yennsarah

답변

3

당신은이 두 기사에 관심이있을 수 있습니다에

RecyclerView와 데이터 바인딩을 사용 : https://medium.com/google-developers/android-data-binding-list-tricks-ef3d5630555e

으로 : RecyclerView (예를 들어있는 LinearLayout)없이리스트와 데이터 바인딩을 사용하여 https://medium.com/google-developers/android-data-binding-recyclerview-db7c40d9f0e4

ItemDecoration에서는 RecyclerView가 여러 항목 장식을 허용하므로 사용자 고유의 BindingAdapter를 추가해야합니다. 이 같은 것이 작동해야합니다.

@BindingAdapter("itemDecoration") 
public static void setItemDecoration(RecyclerView view, ItemDecoration old, 
     ItemDecoration newVal) { 
    if (old != null) { 
     view.removeItemDecoration(old); 
    } 
    if (newVal != null) { 
     view.addItemDecoration(newVal); 
    } 
} 

Context에 대한 약간의 혼란이 있습니다. Context에 데이터 바인딩이 어떻게 필요한지 상상해보십시오. 데이터 바인딩 식은 new을 허용하지 않으므로 그렇게 만들 수 없습니다.

@BindingAdapter("dividerDirection") 
public static void setItemDecoration(RecyclerView view, int oldDirection, int newDirection) { 
    if (oldDirection != newDirection) { 
     ItemDecoration decoration = 
       new DividerItemDecoration(view.getContext(), newDirection); 
     ItemDecoration old = ListenerUtil.trackListener(view, decoration, R.id.decoration); 
     if (old != null) { 
      view.removeItemDecoration(old); 
     } 
     view.addItemDecoration(decoration); 
    } 
} 

그것은 다음과 같이 준수 할 것 : 아마도 당신은 대신 몇 가지 표현을 사용하여 생각하고 다른 용도를 위해

<android.support.v7.widget.RecyclerView 
    app:dividerDirection="@{DividerItemDecoration.HORIZONTAL}" .../> 

자동으로 내장 된 "컨텍스트"변수에 부여됩니다 귀하의 레이아웃과 당신이 전화하는 모든 방법에 전달할 수 있습니다. 바운드 뷰 계층의 루트 뷰의 컨텍스트이며 대부분의 필요에 따라 작동해야합니다. 대부분의 용도로 모델의 컨텍스트를 전달할 필요는 없습니다.

<android.support.v7.widget.RecyclerView 
    app:itemAnimator="@{model.animator}" .../> 
+0

George, 고맙습니다. 혼란 스럽기 때문에 제 질문이 혼란 스럽습니다. 그러나 당신은 테이블에 흥미로운 아이디어를 넣었습니다. 이미 알고있는 것들도 있었고, 다른 것들은 새 것이었고, 나는 오늘 그것을 시도 할 것입니다.:) – Alessandro

+0

ItemDecoration 예제에서 Dimension 리소스에 액세스하기 위해 ItemDecoration에서 컨텍스트가 필요한 경우 어떻게해야합니까? 보기에서 컨텍스트를 전달하지 않고 ViewModel에서 어떻게 인스턴스화 할 수 있습니까? – Alessandro

+0

쉬운 방법은 치수를 속성'app : dividerWidth = "@ {@ dim/thickDivider}"'로 전달하는 것입니다. 다중 속성 BindingAdapter가 필요합니다. –