1

I am implementing recyclerview with multiple layouts.Usually we have multiple viewholders for different layouts and override other methods as per the required layout.I have successfully implemented this.But now i have a different scenario like: A recyclerview that shows some videos (say 3) then another layout(say layout x), again 3 videos and then again layout x and so on.Suppose i have 10 videos then in this case the itemcount would be 10 + 3 as 3 layout x would be displayed.But the videos are loaded while scrolling.So how can i determine the number of views to return in getItemCount();
I mean

@Override
public int getItemCount() {

      return ListofVideos.size() + "WHAT??"
}

layout is like this
enter image description here

If all the videos are loaded at at once then it is easy to calculate the number of views like if i have 21 videos i would have total 27 views(i.e 21 videos and 6 layout X views). But when the list is loaded on scroll how can i determine the number of views?

Rajesh Gosemath
  • 1,812
  • 1
  • 17
  • 31

1 Answers1

0

Your Adapter is responsible to populate view so it has all views of your RecyclerView while your ListofVideos (may) have only video links.

Whenever you scroll your RecyclerView, Adapter is responsible to inflate views.

What you should do?

Create an interface

public interface BaseItem {

    int ITEM_TYPE_HEADER = 0;
    int ITEM_TYPE_SUB_HEADER = 1;
    int ITEM_TYPE_ROW_NORMAL = 2;

    int getItemType();
}

And implement this interface with your adapter's video item like

public class YourAdapterVideoItem implements BaseItem {
  
   // rest of your code

   @Override
   public int getItemType() {
       return ITEM_TYPE_ROW_NORMAL;
   }
}

Create your adapter's header item

public class YourAdapterHeaderItem  implements BaseItem {

    // rest of your code

    @Override
    public int getItemType() {
        return ITEM_TYPE_HEADER;
    }
}

Update your adapter with

public class YourAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

   private List<BaseItem> items = new ArrayList<BaseItem>();
   
   @Override
    public BaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        BaseRecyclerViewHolder holder;
        switch (viewType) {
            case BaseItem.ITEM_TYPE_ROW_NORMAL:
            default:
                // inflate your default items
                break;
            case BaseItem.ITEM_TYPE_HEADER:
                // inflate your default items
                break;
        }
        return holder;
    }
    
    @Override
    public void onBindViewHolder(BaseRecyclerViewHolder viewHolder, int position) {
        BaseItem base = getItemAt(position);
        switch (base.getItemType()) {
            case BaseItem.ITEM_TYPE_HEADER:
                // populate your header view
                break;
            case BaseItem.ITEM_TYPE_ROW_NORMAL:
                // populate your actual view
                break;
        }
    }
    
    @Override
    public int getItemCount() {
        return items == null ? 0 : items.size();
    }

   @Override
    public int getItemViewType(int position) {
        return getItemAt(position).getItemType();
    }
    
    public BaseItem getItemAt(int position) {
        return items == null ? null : items.get(position);
    }
}

When you want to add header use YourAdapterHeaderItem for your videos use YourAdapterVideoItem.

Hope this helps

Edit

For adding headers in GridLayoutManager have a look at RecyclerView GridLayoutManager with full width header

Community
  • 1
  • 1
Haris Qurashi
  • 2,104
  • 1
  • 13
  • 28