/** * Setup method to install a list of feature controllers into the adapter. * * @param featureControllers the list of feature controllers to install in this adapter. */ public FeaturesAdapter(List<FeatureController<MODEL>> featureControllers) { featureItems = new FeatureItems<>(featureControllers); registerAdapterViewTypeDelegates(featureItems.getFeatureControllers()); }
@Override public int getItemViewType(int position) { return featureItems.get(position).viewType; }
@Override public int getItemCount() { return featureItems.size(); }
List<FeatureController<MODEL>> getFeatureControllers() { return featureItems.getFeatureControllers(); }
/** * Returns the position of the first view item for a given view type * * @param adapterViewTypeDelegate of the feature views. * @return the first position of the view item defined by the given adapterViewTypeDelegate */ @SuppressWarnings("unused") public int getFirstItemPositionForAdapterViewTypeDelegate( AdapterViewTypeDelegate adapterViewTypeDelegate) { int indexViewItem = 0; for (Iterator iterator = this.featureItems.iterator(); iterator.hasNext(); ++indexViewItem) { ViewItem recyclerViewItem = (ViewItem) iterator.next(); if (recyclerViewItem.viewType == adapterViewTypeDelegate.getViewType()) { return indexViewItem; } } return -1; }
FeatureUpdate dispatchFeatureUpdate(@Nullable FeatureUpdate featureUpdate) { if (featureUpdate == null) { return null; } // noinspection unchecked final int offset = featureItems.setItemsAndGetOffset(featureUpdate.newItems, featureUpdate.featureController); featureUpdate.diffResult.dispatchUpdatesTo(new ListUpdateCallbackImpl(this, offset)); return featureUpdate; }
@Nullable FeatureUpdate toFeatureUpdate(FeatureController<MODEL> featureController, MODEL model) { final List<ViewItem> oldItems = featureItems.getItems(featureController); final List<ViewItem> newItems = featureController.buildItems(model); if (newItems == null) { return null; } validateNewViewItems(featureController, newItems); final DiffUtilCallbackImpl callback = new DiffUtilCallbackImpl(mapViewTypeToItemComparator, oldItems, newItems); final DiffResult diffResult = calculateDiff(callback, false); return new FeatureUpdate(featureController, newItems, diffResult); }
/** * Updates the whole list of all items associated with all {@link FeatureController}. * * @param model the input model of all {@link FeatureController} of {@code * featureControllerGroup}. */ @SuppressWarnings("WeakerAccess") public void updateFeatureItems(MODEL model) { for (FeatureController<MODEL> featureController : featureItems.getFeatureControllers()) { dispatchFeatureUpdate(toFeatureUpdate(featureController, 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; } } }