package com.airbnb.epoxy;
import android.support.annotation.LayoutRes;
import android.view.View;
import android.view.ViewGroup;
/**
* A model that allows its view to be built programmatically instead of by inflating a layout
* resource. Just implement {@link #buildView} so the adapter can create a new view for this model
* when needed.
* <p>
* {@link #getViewType()} is used by the adapter to know how to reuse views for this model. This
* means that all models that return the same type should be able to share the same view, and the
* view won't be shared with models of any other type.
* <p>
* If it is left unimplemented then at runtime a unique view type will be created to use for all
* models of that class. The generated view type will be negative so that it cannot collide with
* values from resource files, which are used in normal Epoxy models. If you would like to share
* the same view between models of different classes you can have those classes return the same view
* type. A good way to manually create a view type value is by creating an R.id. value in an ids
* resource file.
*/
public abstract class EpoxyModelWithView<T extends View> extends EpoxyModel<T> {
/**
* Get the view type associated with this model's view. Any models with the same view type will
* have views recycled between them.
*
* @see android.support.v7.widget.RecyclerView.Adapter#getItemViewType(int)
*/
@Override
protected int getViewType() {
return 0;
}
/**
* Create and return a new instance of a view for this model. If no layout params are set on the
* returned view then default layout params will be used.
*
* @param parent The parent ViewGroup that the returned view will be added to.
*/
@Override
protected abstract T buildView(ViewGroup parent);
@Override
protected final int getDefaultLayout() {
throw new UnsupportedOperationException(
"Layout resources are unsupported. Views must be created with `buildView`");
}
@Override
public EpoxyModel<T> layout(@LayoutRes int layoutRes) {
throw new UnsupportedOperationException(
"Layout resources are unsupported. Views must be created with `buildView`");
}
}