2016-12-14 70 views
1

我正在实现与多个layouts的recyclerview。通常我们有不同的布局的多个视图,并根据所需的布局覆盖其他方法。我已成功实现this.But现在我有一个不同的场景例如:回收视图,显示一些视频(比如说3),然后是另一个布局(比如布局x),再3个视频,然后再布局x等等。假设我有10个视频,那么在这种情况下,itemcount将是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; 
    } 
} 

更新您的适配器

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