/** * 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()); }
/** * 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)); } }
public RxFeaturesAdapter(List<FeatureController<MODEL>> featureControllers) { super(featureControllers); featureUpdateComparator = new FeatureUpdateComparator<>(getFeatureControllers()); }
private ViewItem<ChildModel> createViewItem(ChildModel model, int viewType) { AdapterViewTypeDelegate tempDelegate = new StubAdapterViewTypeDelegate(); tempDelegate.setViewType(viewType); return new ViewItem<>(model, tempDelegate); }
@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); }
/** * Adds a {@link FeatureEventListener} to all the {@link AdapterViewTypeDelegate} returned by * {@link #getAdapterViewTypeDelegates()}. * * @param featureEventListener the listener to be added. */ public void addFeatureEventListener(FeatureEventListener featureEventListener) { featureEventSource.addFeatureEventListener(featureEventListener); for (AdapterViewTypeDelegate adapterViewTypeDelegate : getAdapterViewTypeDelegates()) { adapterViewTypeDelegate.addFeatureEventListener(featureEventListener); } }
private void unbindChildView(View childItemView) { ChildViewState childViewState = getChildViewState(childItemView); AdapterViewTypeDelegate delegate = childAdapterViewTypeDelegates.get(childViewState.viewItem.viewType); delegate.unbindViewHolder(childViewState.childViewHolder); childViewHolderCache.get(childViewState.viewItem.viewType).offer(childViewState.childViewHolder); childViewState.clearViewState(); }
@Override public void onBindViewHolder(ViewHolder holder, int position) { final ViewItem item = featureItems.get(position); //noinspection unchecked mapViewTypeToAdapterViewTypeDelegate.get(item.viewType).bindViewHolder(holder, item.model); }
/** * Creates a new item. * * @param model the instance of the {@code MODEL} class. * @param adapterViewTypeDelegate the {@link AdapterViewTypeDelegate} associated with this item. */ public ViewItem(MODEL model, AdapterViewTypeDelegate adapterViewTypeDelegate) { this.model = model; this.viewType = adapterViewTypeDelegate.getViewType(); } }
/** * Removes a {@link FeatureEventListener} from all the {@link AdapterViewTypeDelegate} returned by * {@link #getAdapterViewTypeDelegates()}. * * @param featureEventListener the listener to be removed. */ public void removeFeatureEventListener(FeatureEventListener featureEventListener) { featureEventSource.removeFeatureEventListener(featureEventListener); for (AdapterViewTypeDelegate adapterViewTypeDelegate : getAdapterViewTypeDelegates()) { adapterViewTypeDelegate.removeFeatureEventListener(featureEventListener); } }
private GroupViewHolder createGroupViewHolder() { View itemLayout = createNiceMock(View.class); ViewGroup viewGroup = new StubViewGroup(context); return new GroupViewHolder(itemLayout, viewGroup); }
@Override protected void onUnsubscribe() { featureController.removeFeatureEventListener(listener); } });
/** * @return a {@link DiffUtilComparator} that will be used internally to animate the updates to the * list of items associated to this feature controller. By default, it returns a {@link * DefaultDiffUtilComparator}. * @see DiffUtil */ public DiffUtilComparator createDiffUtilComparator() { return new DefaultDiffUtilComparator<>(); }
private void setChildViewState(RecyclerView.ViewHolder childViewHolder, ViewItem viewItem) { ChildViewState childViewState = getChildViewState(childViewHolder.itemView); childViewState.childViewHolder = childViewHolder; childViewState.viewItem = viewItem; }
@Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); this.recyclerView = recyclerView; }
@Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { super.onDetachedFromRecyclerView(recyclerView); this.recyclerView = null; }
@Override public int getItemCount() { return featureItems.size(); }
@Override public int getItemViewType(int position) { return featureItems.get(position).viewType; }
List<FeatureController<MODEL>> getFeatureControllers() { return featureItems.getFeatureControllers(); }
private RecyclerView.ViewHolder createChildViewHolder(String identity) { return new RecyclerView.ViewHolder(new StubView(context)) { @Override public String toString() { return "ChildViewHolder " + identity; } }; }