package com.airbnb.epoxy;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import java.util.List;
@SuppressWarnings("WeakerAccess")
public class EpoxyViewHolder extends RecyclerView.ViewHolder {
@SuppressWarnings("rawtypes") private EpoxyModel epoxyModel;
private List<Object> payloads;
private EpoxyHolder epoxyHolder;
public EpoxyViewHolder(View view) {
super(view);
}
public void bind(@SuppressWarnings("rawtypes") EpoxyModel model,
@Nullable EpoxyModel<?> previouslyBoundModel, List<Object> payloads, int position) {
this.payloads = payloads;
if (epoxyHolder == null && model instanceof EpoxyModelWithHolder) {
epoxyHolder = ((EpoxyModelWithHolder) model).createNewHolder();
epoxyHolder.bindView(itemView);
}
if (model instanceof GeneratedModel) {
// The generated method will enforce that only a properly typed listener can be set
//noinspection unchecked
((GeneratedModel) model).handlePreBind(this, objectToBind(), position);
}
if (previouslyBoundModel != null) {
// noinspection unchecked
model.bind(objectToBind(), previouslyBoundModel);
} else if (payloads.isEmpty()) {
// noinspection unchecked
model.bind(objectToBind());
} else {
// noinspection unchecked
model.bind(objectToBind(), payloads);
}
if (model instanceof GeneratedModel) {
// The generated method will enforce that only a properly typed listener can be set
//noinspection unchecked
((GeneratedModel) model).handlePostBind(objectToBind(), position);
}
epoxyModel = model;
}
Object objectToBind() {
return epoxyHolder != null ? epoxyHolder : itemView;
}
public void unbind() {
assertBound();
// noinspection unchecked
epoxyModel.unbind(objectToBind());
epoxyModel = null;
payloads = null;
}
public List<Object> getPayloads() {
assertBound();
return payloads;
}
public EpoxyModel<?> getModel() {
assertBound();
return epoxyModel;
}
private void assertBound() {
if (epoxyModel == null) {
throw new IllegalStateException("This holder is not currently bound.");
}
}
@Override
public String toString() {
return "EpoxyViewHolder{"
+ "epoxyModel=" + epoxyModel
+ ", view=" + itemView
+ ", super=" + super.toString()
+ '}';
}
}