I am trying to use multiple ViewHolders in a RecyclerView to swap these views at runtime. I created two classes that extend RecyclerView.ViewHolder:
MenuItemViewHolder
public class MenuItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView menuItemText; public ImageView menuItemPhoto; public RecyclerViewAdapter rva; public MenuItemViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); rva = caller; menuItemText = (TextView) itemView.findViewById(R.id.grid_text); menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image); } @Override public void onClick(View view) { Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show(); } }
SelectedItemViewHolder
public class SelectedItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView menuItemText; public ImageView menuItemPhoto; public RecyclerViewAdapter rva; public SelectedItemViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); menuItemText = (TextView) itemView.findViewById(R.id.grid_text_full); menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image_full); } @Override public void onClick(View view) { Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show(); } }
They are called in my function of the RecyclerViewAdapter class onCreateViewHolder:
RecyclerViewAdapter onCreateViewHolder
// Create new views (invoked by the layout manager) @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case 0: View gridItemLayout = LayoutInflater.from(parent.getContext()) .inflate(R.layout.grid_single, parent, false); // set the view size, margins, paddings and layout parameters MenuItemViewHolder vh = new MenuItemViewHolder(gridItemLayout); case 2: View selectedItemLayout = LayoutInflater.from(parent.getContext()) .inflate(R.layout.grid_single_full, parent, false); // set the view size, margins, paddings and layout parameters SelectedItemViewHolder sivh = new SelectedItemViewHolder(selectedItemLayout); return sivh; } }
When I try to run the code, I get this error:
Error: (48, 36) error: onCreateViewHolder (ViewGroup, int) in the RecyclerViewAdapter cannot override onCreateViewHolder (ViewGroup, int) in the return type of the adapter ViewHolder is not compatible with MenuItemViewHolder, where VH is a variable of the type: VH extends ViewHolder declared in the class Adapter
So the problem is that onCreateViewHolder does not accept my custom classes as inherited from RecyclerView.ViewHolder. I am using Android Studio, so there may be a problem. I am puzzled since I thought Java inheritance would handle this without any problems. Can anyone suggest a solution?
Edit: When I change the return type of onCreateViewHolder to MenuItemViewHolder with only one VH, everything works fine. However, this does not work when I have several VH classes that can be replaced at any time.