2017-03-16 8 views
0

私は、複数の異なるレイアウトファイルで共通のビューモデルを持つRecyclerViewでデータバインディングを使用しています。私は生成されたバインディングファイルを持つことができる方法は共通のインターフェイスを実装して、次の(動作しているが醜い)コードを単純化するか? ActionAdapter内インターフェイスと生成されたバインディングファイル

R.layout.list_item_cat 
R.layout.list_item_dog 
R.layout.list_item_mouse 

@Override 
    public ActionAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     @LayoutRes int layoutToInflate; 
     switch (viewType) { 
      case 0: 
       layoutToInflate = R.layout.list_item_cat; 
       break; 
      case 1: 
       layoutToInflate = R.layout.list_item_dog; 
       break; 
      case 2: 
       layoutToInflate = R.layout.list_item_mouse; 
       break; 
     } 
     return new ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), layoutToInflate, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     if (holder.mBinding instanceof ListItemCatBinding) { 
      ((ListItemCatBinding) holder.mBinding).setViewModel(mViewModelList.get(position)); 
     } 
     else if (holder.mBinding instanceof ListItemDogBinding) { 
      ((ListItemDogBinding) holder.mBinding).setViewModel(mViewModelList.get(position)); 
     } 
     else if (holder.mBinding instanceof ListItemMouseBinding) { 
      ((ListItemMouseBinding) holder.mBinding).setViewModel(mViewModelList.get(position)); 
     } 

私は上記の例は悪くないですけど、操作できるようにするには便利だろうのようなレイアウトファイルを考えると

一般的なことを共有するBindingファイルのセットです。特に複雑な状況では、型を常にチェックしてキャストする必要はありません。この記事

答えて

3

チェックアウトは:

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

あなたが使用することができます。

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    holder.mBinding.setVariable(BR.viewModel, mViewModelList.get(position)); 
    holder.mBinding.executePendingBindings(); 
} 
+0

'executePendingBindings()'も同様に呼び出す価値があります。 – tynn

+0

が合意した。私はそれを追加するために編集します。ありがとう! –

+0

素晴らしいもの!非常に便利で関連性の高い記事もあります。 – Dave

0
あなたはデータバインディング

にしたいの正しいレイアウトを取得するための関数getViewType(int型の位置)をオーバーライドする必要があります

関連する問題