2016-12-14 6 views
1

Я реализую recyclerview с несколькими макетами. Обычно у нас есть несколько владельцев точек для разных макетов и переопределяют другие методы в соответствии с требуемым макетом. Я успешно реализовал это. Но теперь у меня другой сценарий например: recyclerview, который показывает некоторые видео (скажем, 3), затем другой макет (скажем, макет x), снова 3 видео, а затем снова макет x и т. д. Предположим, у меня есть 10 видеороликов, тогда в этом случае элемент будет 10 + 3, 3 будет отображаться x. Но видео загружаются во время прокрутки. Так как я могу определить количество просмотров, возвращаемых в getItemCount();
Я имею в видуAndroid: получение числа просмотров в recyclerview

@Override 
public int getItemCount() { 

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

расположение, как это
enter image description here

Если загружены все видео на сразу, то легко подсчитать количество просмотров, как если у меня есть 21 видео я бы всего 27 просмотров (т.е. 21 видео и 6 макетов X просмотров). Но когда список загружается в прокрутке, как я могу определить количество просмотров?

ответ

0

Ваш Adapter несет ответственность за заполнение вида, поэтому у него есть все виды вашего RecyclerView, в то время как ваши ListofVideos (может) имеют только видео ссылки.

Всякий раз, когда вы прокручиваете RecyclerView, Adapter несет ответственность за раздувание просмотров.

Что вы должны делать?

Создать интерфейс

public interface BaseItem { 

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

    int getItemType(); 
} 

И реализует этот интерфейс с пунктом видео вашего адаптера, как

public class YourAdapterVideoItem implements BaseItem { 

    // rest of your code 

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

Создания элемент заголовка вашего адаптера

public class YourAdapterHeaderItem implements BaseItem { 

    // rest of your code 

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

Update адаптер с

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); 
    } 
} 

Если вы хотите добавить заголовок, используйте YourAdapterHeaderItem для ваших видеороликов, используйте YourAdapterVideoItem.

Надеется, что это помогает

Редактировать

Для добавления заголовков в GridLayoutManager посмотреть на RecyclerView GridLayoutManager with full width header