The current implementation inflates both small and large layout and only uses one of those which is wasteful and an antipattern.
Which layout to use should be determined at the time of creating a ViewHolder not at the time of binding data to it.
@Override
public int getItemViewType(int position) {
final int spanCount = mLayoutManager.getSpanCount();
if (spanCount > 1) {
return R.layout.item_small;
} else {
return R.layout.item_large;
}
}
@Override
public ItemViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(final ItemViewHolder holder, final int position) {
final Item item = mItems.get(position % 4);
holder.title.setText(item.getTitle());
holder.iv.setImageResource(item.getImgResId());
holder.info.setText(item.getLikes() + " likes · " + item.getComments() + " comments");
}
static class ItemViewHolder extends RecyclerView.ViewHolder {
final ImageView iv;
final TextView title;
final TextView info;
ItemViewHolder(View itemView) {
super(itemView);
iv = (ImageView) itemView.findViewById(R.id.image);
title = (TextView) itemView.findViewById(R.id.title);
info = (TextView) itemView.findViewById(R.id.tv_info);
}
}