I would use the same RecyclerView.Adapter
with two or more different fragments. Every fragment uses a different view items layout so I must use a different RecyclerView.ViewHolder
for binding the data.
For the implementation I have created one RecycleView.ViewHolder
that binds the two different view layout with a switch but I think might be something better for this kind of situation.
public class TFViewHolder extends RecyclerView.ViewHolder {
public final static int LAYOUT_ONE = 1;
public final static int LAYOUT_TWO = 2;
public Integer mId;
public ImageView mThumb;
public TextView mName;
public TextView mTitle;
public TextView mDescription;
public final View mView;
public TFViewHolder(View itemView, int layoutType) {
super(itemView);
mView = itemView;
switch (layoutType) {
case LAYOUT_ONE:
mThumb = (ImageView) itemView.findViewById(R.id.thumb);
mName = (TextView) itemView.findViewById(R.id.name);
break;
case LAYOUT_TWO:
mTitle = (TextView) itemView.findViewById(R.id.title);
mDescription = (TextView) itemView.findViewById(R.id.description);
break;
}
itemView.setTag(itemView);
}
}
The RecyclerView.Adapter
:
public class TFRecyclerViewAdapter extends RecyclerView.Adapter<TFViewHolder> {
protected Context context;
protected List items;
private int layout;
private int layoutType;
public TFRecyclerViewAdapter(Context context) {
this.context = context;
}
public TFRecyclerViewAdapter(Context context, int layout, int layoutType) {
this(context);
this.layout = layout;
this.layoutType = layoutType;
}
public void setItems(List items){
this.items = items;
}
@Override
public void onBindViewHolder(final TFViewHolder holder, final int position) {
holder.mId = position;
}
@Override
public TFViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(layout, parent, false);
return new TFViewHolder(itemView, layoutType);
}
@Override
public int getItemCount() {
int l = 0;
if (items != null) {
l = items.size();
}
return l;
}
}
Two different adapters that extend the TFRecyclerViewAdapter
of above:
public class TFNewsRecyclerViewAdapter extends TFRecyclerViewAdapter {
public TFNewsRecyclerViewAdapter(Context context, int layout) {
super(context, layout, TFViewHolder.LAYOUT_NEWS);
}
@Override
public void onBindViewHolder(TFViewHolder holder, int position) {
final News item = (News) items.get(position);
holder.mTitle.setText(item.getTitle());
holder.mDescription.setText(item.getDescription());
super.onBindViewHolder(holder, position);
}
}
and
public class TFTeamsRecyclerViewAdapter extends TFRecyclerViewAdapter {
public TFTeamsRecyclerViewAdapter(Context context, int layout) {
super(context, layout, TFViewHolder.LAYOUT_TEAMS);
}
@Override
public void onBindViewHolder(TFViewHolder holder, int position) {
final Team team = (Team) items.get(position);
Glide.with(holder.mThumb.getContext())
.load(team.getThumb())
.fitCenter()
.crossFade()
.into(holder.mThumb);
holder.mName.setText(team.getName());
super.onBindViewHolder(holder, position);
}
}
getItemViewType()
as described on this SO question: stackoverflow.com/questions/26245139/… \$\endgroup\$