/** * Called by the Adapter from {@link Adapter#onBindViewHolder(RecyclerView.ViewHolder, int, * List)}. Maps the data back to the view, using a non empty PayLoad. * * <p>The default implementation discards the {@code payloads} information and just calls {@link * #bindViewHolder(RecyclerView.ViewHolder, MODEL)}. Override, if you want to implement more * fine-grained, payload based updates. * * @param holder The ViewHolder which should be updated to represent the contents of the item at * the given position in the data set. * @param model The Model containing all the data for the ViewHolder to bind to. * @param payloads the payload of changes. An empty list means the view holder needs full re-bind. */ public void bindViewHolder(HOLDER holder, MODEL model, List<Object> payloads) { bindViewHolder(holder, model); }
@Override public void onBindViewHolder(ViewHolder holder, int position) { final ViewItem item = featureItems.get(position); //noinspection unchecked mapViewTypeToAdapterViewTypeDelegate.get(item.viewType).bindViewHolder(holder, item.model); }
@Override public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) { final ViewItem item = featureItems.get(position); AdapterViewTypeDelegate adapterViewTypeDelegate = mapViewTypeToAdapterViewTypeDelegate.get(item.viewType); try { //noinspection unchecked adapterViewTypeDelegate.bindViewHolder(holder, item.model, payloads); } catch (Exception exception) { if (featuresAdapterErrorHandler != null) { featuresAdapterErrorHandler.onBindViewHolderError(exception, position); } else { throw exception; } } }
@Override public void bindViewHolder(HOLDER holder, List<ViewItem> viewItems) { unbindViewHolder(holder); for (ViewItem viewItem : viewItems) { final RecyclerView.ViewHolder childViewHolder = getChildViewHolder(viewItem.viewType, getRootViewGroup(holder)); final AdapterViewTypeDelegate delegate = childAdapterViewTypeDelegates.get(viewItem.viewType); delegate.bindViewHolder(childViewHolder, viewItem.model); setChildViewState(childViewHolder, viewItem); getRootViewGroup(holder).addView(childViewHolder.itemView); } }
case Operation.ADD: RecyclerView.ViewHolder childViewHolder = getChildViewHolder(viewItem.viewType, rootViewGroup); delegate.bindViewHolder(childViewHolder, viewItem.model); rootViewGroup.addView(childViewHolder.itemView, i); setChildViewState(childViewHolder, viewItem); ChildViewState childViewState = getChildViewState(rootViewGroup.getChildAt(i)); if (operation.payload != null) { delegate.bindViewHolder(childViewState.childViewHolder, viewItem.model, singletonList(operation.payload)); } else { delegate.bindViewHolder(childViewState.childViewHolder, viewItem.model);
private TargetGroupAdapterViewTypeDelegate createTargetDelegateWithState(List<AdapterViewTypeDelegate> delegates, List<ViewItem> viewItems, List<RecyclerView.ViewHolder> childViewHolders, GroupViewHolder groupHolder) { for (int i = 0; i < viewItems.size(); i++) { ViewItem viewItem = viewItems.get(i); RecyclerView.ViewHolder childViewHolder = childViewHolders.get(i); AdapterViewTypeDelegate delegate = delegates.get(viewItem.viewType); expect(delegate.createViewHolder(groupHolder.viewGroup)).andReturn(childViewHolder).times(1); delegate.bindViewHolder(childViewHolder, viewItem.model); } replayAll(); TargetGroupAdapterViewTypeDelegate target = new TargetGroupAdapterViewTypeDelegate(delegates); target.bindViewHolder(groupHolder, viewItems); resetAll(); return target; }
delegates.get(0).bindViewHolder(childViewHolders.get(0), viewItems.get(0).model); delegates.get(1).bindViewHolder(childViewHolders.get(1), viewItems.get(1).model);
delegates.get(1).unbindViewHolder(childViewHolders.get(3)); delegates.get(0).bindViewHolder(childViewHolders.get(0), viewItems.get(0).model); delegates.get(1).bindViewHolder(childViewHolders.get(1), viewItems.get(1).model); delegates.get(0).bindViewHolder(childViewHolders.get(2), viewItems.get(2).model); delegates.get(1).bindViewHolder(childViewHolders.get(3), viewItems.get(3).model);
delegates.get(1).unbindViewHolder(childViewHolders.get(3)); delegates.get(0).bindViewHolder(childViewHolders.get(0), viewItems.get(0).model); delegates.get(1).bindViewHolder(childViewHolders.get(1), viewItems.get(1).model); delegates.get(0).bindViewHolder(childViewHolders.get(2), viewItems.get(2).model); delegates.get(1).bindViewHolder(childViewHolders.get(3), viewItems.get(3).model);
delegates.get(1).unbindViewHolder(childViewHolders.get(3)); delegates.get(0).bindViewHolder(childViewHolders.get(0), viewItems.get(0).model); delegates.get(1).bindViewHolder(childViewHolders.get(1), viewItems.get(1).model); delegates.get(0).bindViewHolder(childViewHolders.get(2), viewItems.get(2).model); delegates.get(1).bindViewHolder(childViewHolders.get(3), viewItems.get(3).model);
expect(delegates.get(0).createViewHolder(groupHolder.viewGroup)).andReturn(newChildViewHolders.get(2)).times(1); delegates.get(0).bindViewHolder(newChildViewHolders.get(1), newViewItems.get(1).model); delegates.get(0).bindViewHolder(newChildViewHolders.get(2), newViewItems.get(2).model);
delegates.get(0).bindViewHolder(newChildViewHolders.get(0), newViewItems.get(0).model); delegates.get(0).bindViewHolder(newChildViewHolders.get(1), newViewItems.get(1).model);
expect(delegates.get(0).createViewHolder(groupHolder.viewGroup)).andReturn(newChildViewHolders.get(3)).times(1); delegates.get(0).bindViewHolder(newChildViewHolders.get(1), newViewItems.get(1).model); delegates.get(0).bindViewHolder(newChildViewHolders.get(3), newViewItems.get(3).model);