package com.airbnb.epoxy.sample; import android.support.v7.widget.RecyclerView.RecycledViewPool; import com.airbnb.epoxy.AutoModel; import com.airbnb.epoxy.R; import com.airbnb.epoxy.TypedEpoxyController; import com.airbnb.epoxy.sample.models.ButtonModel_; import com.airbnb.epoxy.sample.models.CarouselModelGroup; import com.airbnb.epoxy.sample.models.HeaderModel_; import java.util.List; public class SampleController extends TypedEpoxyController<List<CarouselData>> { public interface AdapterCallbacks { void onAddCarouselClicked(); void onClearCarouselsClicked(); void onShuffleCarouselsClicked(); void onChangeAllColorsClicked(); void onAddColorToCarouselClicked(CarouselData carousel); void onClearCarouselClicked(CarouselData carousel); void onShuffleCarouselColorsClicked(CarouselData carousel); void onChangeCarouselColorsClicked(CarouselData carousel); void onColorClicked(CarouselData carousel, int colorPosition); } @AutoModel HeaderModel_ header; @AutoModel ButtonModel_ addButton; @AutoModel ButtonModel_ clearButton; @AutoModel ButtonModel_ shuffleButton; @AutoModel ButtonModel_ changeColorsButton; private final AdapterCallbacks callbacks; private final RecycledViewPool recycledViewPool; SampleController(AdapterCallbacks callbacks, RecycledViewPool recycledViewPool) { this.callbacks = callbacks; this.recycledViewPool = recycledViewPool; setDebugLoggingEnabled(true); } @Override protected void buildModels(List<CarouselData> carousels) { header .title(R.string.epoxy) .caption(R.string.header_subtitle); // "addTo" is not needed since implicit adding is enabled // (https://github.com/airbnb/epoxy/wiki/Epoxy-Controller#implicit-adding) addButton .textRes(R.string.button_add) .clickListener((model, parentView, clickedView, position) -> { callbacks.onAddCarouselClicked(); }); clearButton .textRes(R.string.button_clear) .clickListener(v -> callbacks.onClearCarouselsClicked()) .addIf(carousels.size() > 0, this); shuffleButton .textRes(R.string.button_shuffle) .clickListener(v -> callbacks.onShuffleCarouselsClicked()) .addIf(carousels.size() > 1, this); changeColorsButton .textRes(R.string.button_change) .clickListener(v -> callbacks.onChangeAllColorsClicked()) .addIf(carousels.size() > 0, this); for (int i = 0; i < carousels.size(); i++) { CarouselData carousel = carousels.get(i); add(new CarouselModelGroup(carousel, callbacks, recycledViewPool)); } } @Override protected void onExceptionSwallowed(RuntimeException exception) { // Best practice is to throw in debug so you are aware of any issues that Epoxy notices. // Otherwise Epoxy does its best to swallow these exceptions and continue gracefully throw exception; } }