Implement the following interface:
public static abstract class Adapter<VH extends ViewHolder> {
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
public abstract void onBindViewHolder(VH holder, int position);
public abstract int getItemViewType(int position);
...
}
then create different kinds of ViewHolder for different view type.
Example:
@Override
public int getItemViewType(int position) { // this is the key point of supporting multi-type of views.
NewsDigestPresenter digest = (NewsDigestPresenter) mChannelPresenter.allCachedDigests().get(position);
return digest.getDigestType().ordinal();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
NewsDigestType digestType = NewsDigestType.values()[viewType];
switch (digestType) {
case SingleImageArticle:
SingleImageArticleDigestView singleImageArticleDigestView = new SingleImageArticleDigestView();
return new SingleImageArticleDigestViewHolder(singleImageArticleDigestView);
case MultiImagesArticle:
MultiImagesArticleDigestView multiImagesArticleDigestView = new MultiImagesArticleDigestView();
return new MultiImagesArticleDigestViewHolder(multiImagesArticleDigestView);
case Images:
ImagesDigestView imagesDigests = new ImagesDigestView();
return new ImagesDigestViewHolder(imagesDigests);
}
return null;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int type = getItemViewType(position);
NewsDigestType digestType = NewsDigestType.values()[type];
NewsDigestPresenter newsDigestPresenter = (NewsDigestPresenter) mChannelPresenter.allCachedDigests().get(position);
switch (digestType) {
case SingleImageArticle:
SingleImageArticleDigestViewHolder singleImageArticleDigestViewHolder = (SingleImageArticleDigestViewHolder)holder;
singleImageArticleDigestViewHolder.setDataBinding(newsDigestPresenter);
if(mIsFirstScreen) {
singleImageArticleDigestViewHolder.loadImages();
}
break;
case MultiImagesArticle:
MultiImagesArticleDigestViewHolder multiImagesArticleDigestViewHolder = (MultiImagesArticleDigestViewHolder)holder;
multiImagesArticleDigestViewHolder.setDataBinding(newsDigestPresenter);
if(mIsFirstScreen) {
multiImagesArticleDigestViewHolder.loadImages();
}
break;
case Images:
ImagesDigestViewHolder imagesDigestViewHolder = (ImagesDigestViewHolder)holder;
imagesDigestViewHolder.setDataBinding(newsDigestPresenter);
if (mIsFirstScreen) {
imagesDigestViewHolder.loadImages();
}
}
}
}