2016-06-16 14 views
3

DatabindingRecyclerViewを連携させる方法が不思議です。私は次のようにアダプタクラスが定義されている:私は再レンダリングこれらの新しいオブジェクトにRecyclerViewを希望アンドロイドアプリのデータバインディングとリサイクルビュー

public class RestaurantRecyclerViewAdapter extends RecyclerView.Adapter<RestaurantRecyclerViewAdapter.BindingHolder> { 

    private RestaurantsListViewModel mDataContext; 

    public RestaurantRecyclerViewAdapter(RestaurantsListViewModel vm) { 
     mDataContext = vm; 
    } 


    @Override 
    public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_restaurant_list_item, parent, false); 
     BindingHolder holder = new BindingHolder(v); 

     return holder; 
    } 

    @Override 
    public void onBindViewHolder(final BindingHolder holder, int position) { 
     final RestaurantListItemViewModel restaurant = mDataContext.getRestaurant(position); 

     holder.getBinding().setVariable(BR.restaurant, restaurant); 
     holder.getBinding().executePendingBindings(); 
    } 

    @Override 
    public int getItemCount() { 
     return mDataContext.getRestaurantsCount(); 
    } 

    public class BindingHolder extends RecyclerView.ViewHolder { 

     private ViewDataBinding binding; 

     public BindingHolder(View rowView) { 
      super(rowView); 
      binding = DataBindingUtil.bind(rowView); 
     } 

     public ViewDataBinding getBinding() { 
      return binding; 
     } 

    } 

} 

RestaurantListViewModel場合には、いくつかの新しいレストランで更新されます。どうすればそれを達成できますか?

EDIT:

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
    final RestaurantListItemViewModel restaurant = restaurants.get(position); 

    holder.getBinding().setVariable(BR.restaurant, restaurant); 
    holder.getBinding().executePendingBindings(); 
} 

は今何getBinding方法がありません:

@Vladimirsアプローチしかし、私はトラブルonBindViewHolderメソッドを実装したんだ、賢明なようです。

答えて

3

あなたはそれが部分的に考慮していない非常に単純な方法であるビューモデル

public final ObservableList<Object> items = new ObservableArrayList<>(); 

public class RecyclerViewAdapters { 

    @BindingAdapter("items") 
    public static void setItems(RecyclerView view, List<Object> items) { 
     RecyclerView.Adapter<?> adapter = view.getAdapter(); 
     if (adapter instanceof RestaurantRecyclerViewAdapter) { 
      // tell RestaurantRecyclerViewAdapter to set new list of items 
     } else { 
      throw new IllegalArgumentException("RecyclerView.Adapter is not RestaurantRecyclerViewAdapter"); 
     } 
    } 
} 

最初と最後にXMLレイアウト

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:items="@{viewModel.items}" 
    app:layoutManager="LinearLayoutManager"/> 

でアダプターを作成することができますアイテムの変更、ObservableListとをもっと見ることができますOnListChangedCallbackのフォローアップとして、

UPD 、私はこのようなものがリストの正確な変化に反応するように、アダプタを用いて実施することもできるかもしれ思いました。

public class ObservableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    ObservableList<Object> list; 

    ObservableList.OnListChangedCallback<ObservableList<Object>> callback = new ObservableList.OnListChangedCallback<ObservableList<Object>>() { 
     @Override 
     public void onChanged(ObservableList<Object> sender) { 
      notifyDataSetChanged(); 
     } 

     @Override 
     public void onItemRangeChanged(ObservableList<Object> sender, int positionStart, int itemCount) { 
      notifyItemRangeChanged(positionStart, itemCount); 
     } 

     @Override 
     public void onItemRangeInserted(ObservableList<Object> sender, int positionStart, int itemCount) { 
      notifyItemRangeInserted(positionStart, itemCount); 
     } 

     @Override 
     public void onItemRangeMoved(ObservableList<Object> sender, int fromPosition, int toPosition, int itemCount) { 
      notifyItemRangeRemoved(fromPosition, itemCount); 
      notifyItemRangeInserted(toPosition, itemCount); 
     } 

     @Override 
     public void onItemRangeRemoved(ObservableList<Object> sender, int positionStart, int itemCount) { 
      notifyItemRangeRemoved(positionStart, itemCount); 
     } 
    }; 

    public ObservableListAdapter(@NonNull ObservableList<Object> list) { 
     this.list = list; 
     this.list.addOnListChangedCallback(callback); 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
} 
+0

私は少し混乱しています。 'setItems'メソッドはどこに置くべきですか? –

+0

あなたが望むどんなクラスでも。私は、RecyclerViewAdaptersというクラスを作成し、そこに関数を配置しました。私は今自分自身を試して、質問の更新された第二部分を参照してください。それは魅力のように動作し、XMLの必要はありません。あなたのObservableListをコンストラクタに渡すだけです。 –

+0

次の質問 - メソッド 'onBindViewHolder'をオーバーライドする必要がありますが、私はあなたのアプローチを使用してこれを行う方法がわかりません。私の更新された質問を見てください。 –

関連する問題