5
\$\begingroup\$

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);
 }
}
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Sep 26, 2015 at 12:20
\$\endgroup\$
2
  • \$\begingroup\$ Commenting because I haven't had time to look too closely, but instead of switching inside the ViewHolder you could create multiple ViewHolder objects and make use of getItemViewType() as described on this SO question: stackoverflow.com/questions/26245139/… \$\endgroup\$ Commented Oct 2, 2015 at 17:56
  • \$\begingroup\$ what if I want to use same adapter for different fragments? \$\endgroup\$ Commented Apr 12, 2018 at 13:30

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.