【问题标题】:Android:getting number of views in recyclerviewAndroid:在recyclerview中获取视图数
【发布时间】:2016-12-14 11:01:33
【问题描述】:

我正在实现具有多个布局的 recyclerview。通常我们有多个视图用于不同的布局,并根据所需的布局覆盖其他方法。我已经成功实现了这一点。但现在我有一个不同的场景,比如:一个显示一些视频的 recyclerview (比如 3)然后是另一个布局(比如布局 x),再次是 3 个视频,然后是布局 x 等等。假设我有 10 个视频,那么在这种情况下,项目计数将为 10 + 3,因为将显示 3 个布局 x。但是滚动时加载视频。那么我如何确定在 getItemCount() 中返回的视图数;
我的意思是

@Override
public int getItemCount() {

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

布局是这样的

如果一次加载所有视频,则很容易计算观看次数,例如如果我有 21 个视频,我将总共有 27 个观看次数(即 21 个视频和 6 个布局 X 观看次数)。但是当列表加载滚动时,我如何确定查看次数?

【问题讨论】:

    标签: android android-recyclerview adapter onscroll


    【解决方案1】:

    您的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多