package com.badoo.chateau.example.ui.util.recycle; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; /** * User to proxy updates to on Adapter to another adapter, useful when wrapping {@link android.support.v7.widget.RecyclerView.Adapter}s */ public class DataObserverProxy extends RecyclerView.AdapterDataObserver { @NonNull private final RecyclerView.Adapter<?> mTo; private final Converter mConverter; public DataObserverProxy(@NonNull RecyclerView.Adapter<?> to) { this(to, new Converter()); } /** * @param to adapter to forward the updates too. * @param converter to convert the position to the relevant position in to to adapter. */ public DataObserverProxy(@NonNull RecyclerView.Adapter<?> to, @NonNull Converter converter) { mTo = to; mConverter = converter; } @Override public void onChanged() { mTo.notifyDataSetChanged(); } @Override public void onItemRangeChanged(int positionStart, int itemCount) { mTo.notifyItemRangeChanged(mConverter.convertPosition(positionStart), itemCount); } @Override public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { mTo.notifyItemRangeChanged(mConverter.convertPosition(positionStart), itemCount, payload); } @Override public void onItemRangeInserted(int positionStart, int itemCount) { mTo.notifyItemRangeInserted(mConverter.convertPosition(positionStart), itemCount); } @Override public void onItemRangeRemoved(int positionStart, int itemCount) { mTo.notifyItemRangeRemoved(mConverter.convertPosition(positionStart), itemCount); } @Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { mTo.notifyItemMoved(mConverter.convertPosition(fromPosition), mConverter.convertPosition(toPosition)); } public static class Converter { /** * Convert position to the position in the adapter been proxied to, by default returns to the position given. */ public int convertPosition(int position) { return position;} } }