티스토리 뷰

728x90
반응형

ViewHolder 클래스 만들기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyVh extends RecyclerView.ViewHolder{
 
    private final ItemBinding binding;
 
    public MyVh(ItemBinding binding){
        super(binding.getRoot());
        this.binding = binding;
    }
    
    public void bind(Item item){
        binding.setItem(item);
        binding.executePendingBindings();
    }
}
cs


변수나 Observable이 변경되면 바인딩이 다음 프레임 전에 변경되도록 예약을 한다.


하지만 바인딩을 즉시 실행해야 할 때가 있다. 이럴 때 강제로 실행하기 위해



1
executePendingBindings()
cs


메소드를 이용한다



1
2
3
4
public MyVh(View itemView){
    super(itemView);
    binding = DataBindingUtil.bind(itemView);
}
cs


이런 형식도 가능하다



사용

 

1
2
3
4
5
6
7
8
9
10
public MyVh onCreateViewHolder(ViewGroup parent, int viewType){
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    ItemBinding itemBinding = ItemBinding.inflate(inflater, parent, false);
    return new MyVh(itemBinding);
}
 
public void onBindViewHolder(MyVh holder, int position){
    Item item = getItemFroPosition(position);
    holder.bind(item);
}
cs

 

 

동적인 Layout 바인딩

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyVh extends RecyclerView.ViewHolder{
 
    private final ViewDataBinding binding; 
 
    public MyVh(ViewDataBinding binding){
        super(binding.getRoot());
        this.binding = binding;
    }
 
     public void bind(Object obj){
        binding.setVariable(BR.obj, obj);
        binding.executePendingBindings();
    }
}
cs

 

 

생성되는 바인딩 클래스는 레이아웃 내에서 레이아웃 변수를 View와 연결하고 


생성되는 바인딩 클래스는 모두 ViewDataBinding을 확장한다.

 

Observable 인터페이스를 구현하는 클래스를 사용하면 바인딩이 바인딩된 객체에 단일 리스너를 연결하여


그 객체에 대한 모든 속성의 변경 사항을 수신할 수 있다.


getter에 Bindable 주석을 할당하고 setter에서 이를 알림으로써 속성 변경을 알릴 수 있다

 

Bindable주석은 컴파일 중에 BR 클래스 파일에 항목을 생성한다. 이 파일은 모듈 패키지에 생성된다

 

 

 

+ References


https://medium.com/google-developers/android-data-binding-recyclerview-db7c40d9f0e4

 

http://gun0912.tistory.com/71

반응형
공지사항
최근에 올라온 글