... final MyDiffCallback diffCallback = new MyDiffCallback(getOldItems(), getNewItems()); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); mRecyclerViewAdapter.setItems(getNewItems()); diffResult.dispatchUpdatesTo(mRecyclerViewAdapter); ...
public class MyDiffCallback extends DiffUtil.Callback { private final List<BaseItemModel> mOldList; private final List<BaseItemModel> mNewList; public MyDiffCallback(List<BaseItemModel> oldList, List<BaseItemModel> newList) { mOldList = oldList; mNewList = newList; } @Override public int getOldListSize() { return mOldList.size(); } @Override public int getNewListSize() { return mNewList.size(); } @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { return mOldList.get(oldItemPosition).getID() == mNewList.get( newItemPosition).getID(); } @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { BaseItemModel oldItem = mOldList.get(oldItemPosition); BaseItemModel newItem = mNewList.get(newItemPosition); return oldItem.equals(newItem); } @Nullable @Override public Object getChangePayload(int oldItemPosition, int newItemPosition) { return super.getChangePayload(oldItemPosition, newItemPosition); } }
public interface BaseItemModel extends ItemModel { int getID(); }
public abstract static class DiffCallback <BM extends ItemModel> extends DiffUtil.Callback { private final List<BM> mOldItems = new ArrayList<>(); private final List<BM> mNewItems = new ArrayList<>(); void setItems(List<BM> oldItems, List<BM> newItems) { mOldItems.clear(); mOldItems.addAll(oldItems); mNewItems.clear(); mNewItems.addAll(newItems); } @Override public int getOldListSize() { return mOldItems.size(); } @Override public int getNewListSize() { return mNewItems.size(); } @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { return areItemsTheSame( mOldItems.get(oldItemPosition), mNewItems.get(newItemPosition) ); } public abstract boolean areItemsTheSame(BM oldItem, BM newItem); @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { return areContentsTheSame( mOldItems.get(oldItemPosition), mNewItems.get(newItemPosition) ); } public abstract boolean areContentsTheSame(BM oldItem, BM newItem); ... }
public void setItems(List<ItemModel> items, DiffCallback diffCallback) { diffCallback.setItems(mItems, items); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); mItems.clear(); mItems.addAll(items); diffResult.dispatchUpdatesTo(this); }
public interface CompositeItemModel extends ItemModel { List<ItemModel> getItems(); }
public abstract class CompositeViewRenderer <M extends CompositeItemModel, VH extends CompositeViewHolder> extends ViewRenderer<M, VH> { private final ArrayList<ViewRenderer> mRenderers = new ArrayList<>(); public CompositeViewRenderer(int viewType, Context context) { super(viewType, context); } public CompositeViewRenderer(int viewType, Context context, ViewRenderer... renderers) { super(viewType, context); Collections.addAll(mRenderers, renderers); } public CompositeViewRenderer registerRenderer(ViewRenderer renderer) { mRenderers.add(renderer); return this; } public void bindView(M model, VH holder) {} public VH createViewHolder(ViewGroup parent) { return ...; } ... }
public abstract class CompositeViewRenderer <M extends CompositeItemModel, VH extends CompositeViewHolder> extends ViewRenderer<M, VH> { private final ArrayList<ViewRenderer> mRenderers = new ArrayList<>(); private RendererRecyclerViewAdapter mAdapter; ... public void bindView(M model, VH holder) { mAdapter.setItems(model.getItems()); mAdapter.notifyDataSetChanged(); } public VH createViewHolder(ViewGroup parent) { mAdapter = new RendererRecyclerViewAdapter(); for (final ViewRenderer renderer : mRenderers) { mAdapter.registerRenderer(renderer); } return ???; } ... }
public abstract class CompositeViewHolder extends RecyclerView.ViewHolder { public RecyclerView mRecyclerView; public CompositeViewHolder(View itemView) { super(itemView); } }
public abstract class CompositeViewRenderer <M extends CompositeItemModel, VH extends CompositeViewHolder> extends ViewRenderer<M, VH> { public VH createViewHolder(ViewGroup parent) { mAdapter = new RendererRecyclerViewAdapter(); for (final ViewRenderer renderer : mRenderers) { mAdapter.registerRenderer(renderer); } VH viewHolder = createCompositeViewHolder(parent); viewHolder.mRecyclerView.setLayoutManager(createLayoutManager()); viewHolder.mRecyclerView.setAdapter(mAdapter); return viewHolder; } public abstract VH createCompositeViewHolder(ViewGroup parent); protected RecyclerView.LayoutManager createLayoutManager() { return new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false); } ... }
public class SomeCompositeItemModel implements CompositeItemModel { public static final int TYPE = 999; private int mID; private final List<ItemModel> mItems; public SomeCompositeItemModel(final int ID, List<ItemModel> items) { mID = ID; mItems = items; } public int getID() { return mID; } public int getType() { return TYPE; } public List<ItemModel> getItems() { return mItems; } }
public class SomeCompositeViewHolder extends CompositeViewHolder { public SomeCompositeViewHolder(View view) { super(view); mRecyclerView = (RecyclerView) view.findViewById(R.id.composite_recycler_view); } }
public class SomeCompositeViewRenderer extends CompositeViewRenderer<SomeCompositeModel, SomeCompositeViewHolder> { public SomeCompositeViewRenderer(int viewType, Context context) { super(viewType, context); } public SomeCompositeViewHolder createCompositeViewHolder(ViewGroup parent) { return new SomeCompositeViewHolder(inflate(R.layout.item_composite, parent)); } }
public class SomeActivity extends AppCompatActivity { protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... SomeCompositeViewRenderer composite = new SomeCompositeViewRenderer( SomeCompositeItemModel.TYPE, this, new SomeViewRenderer(SomeModel.TYPE, this, mListener) ); mRecyclerViewAdapter.registerRenderer(composite); ... } ... }
public class SomeViewRenderer extends ViewRenderer<SomeModel, SomeViewHolder> { private final Listener mListener; public SomeViewRenderer(int type, Context context, Listener listener) { super(type, context); mListener = listener; } public void bindView(SomeModel model, SomeViewHolder holder) { ... holder.itemView.setOnClickListener(new View.OnClickListener() { public void onClick(final View view) { mListener.onSomeItemClicked(model); } }); } ... public interface Listener { void onSomeItemClicked(SomeModel model); } }
Source: https://habr.com/ru/post/337774/
All Articles