具有 2x1 排列的 Gridlayoutmanager

Posted

技术标签:

【中文标题】具有 2x1 排列的 Gridlayoutmanager【英文标题】:Gridlayoutmanager with 2x1 arrangement 【发布时间】:2018-07-28 06:56:45 【问题描述】:

我正在尝试使用 recyclerview 中的 gridlayoutmanager 制作如下 UI:

+-------+ +-------+ | | | | | | | | | | | | +-------+ +-------+ +-----------------+ | | | | +-----------------+

我在这里调整 onBindViewHolder 的宽度:

int mode = (position+1)%4;
        int h_mul = 1, w_mul = 1;
        switch (mode)
            case 0:
                h_mul = w_mul = 2;
                break;
            case 2:
                w_mul = 2;
                break;
            case 3:
            case 1:
            default:
                h_mul = w_mul = 1;
                break;
        
        mCardView.getLayoutParams().height = h_mul * mContext.getResources().getInteger(R.integer.video_tile_height);
        mCardView.getLayoutParams().width = w_mul * mContext.getResources().getInteger(R.integer.video_tile_width);

我尝试了多种方法: 1.带setSpanSizeLookup的水平gridlayoutmanager:

    manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() 
        @Override
        public int getSpanSize(int position) 
            int mode = (position+1)%4;
            switch (mode)
                case 0:
                case 2:
                    return manager.getSpanCount();
                case 3:
                case 1:
                    return 1;
                default:
                    return -1;
            
        
    );

我的结局是这样的:

+------------+ +-----------------+ +---- --------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------+ +-----------------+ +---- --------+

如果我不设置跨度,那么它会像这样结束:

+------------+ +----------------+ | | | | | | | | | | | | | | | | | | | | +------------+ +----------------+ +---------------+ | | | | | | | | | | +---------------+

    水平交错网格布局管理器。 如果是使用

     StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
            layoutParams.setFullSpan(true);
    

然后就变成了

+------------+ +-----------------+ +---- --------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------+ +-----------------+ +---- --------+

如果我最初不使用全跨度,它是完美的,但如果我滚动 recyclerview,它会变得和上面一样:

+------------+ +-----------------+ +---- --------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------+ +-----------------+ +---- --------+

我不明白是什么原因造成的。有人可以指出我可能犯了什么错误吗?

【问题讨论】:

你的回收站是立式的还是卧式的? 【参考方案1】:

您想要实现一个水平回收器视图,其中您可以重复这三个框。但是您将这 3 个框视为单独的回收站项目的方法不允许您分组滚动它们。您需要做的是定义一个单独的布局,其中包含这 3 个框。然后为它提供 3 个项目的数据并将其绑定在视图持有者中

基本上你必须操纵你的数据来分组喜欢这个然后显示它。

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    if (viewType == GROUP_ITEM) 
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.group_item, parent, false);
        return new GroupViewHolder(view);
     else if (viewType == SINGLE_ITEM) 
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_item, parent, false);
        return new SingleViewHolder(view);
    

    return null;


public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    if (holder instanceof GroupViewHolder) 
        ((GroupViewHolder) holder).populateData(position);
     else if (holder instanceof SingleViewHolder) 
      // populate your normal view.
    

【讨论】:

以上是关于具有 2x1 排列的 Gridlayoutmanager的主要内容,如果未能解决你的问题,请参考以下文章

生成具有重复元素的列表排列

具有唯一值的排列

如何检查排列是不是具有相等的奇偶性?

python itertools 具有绑定值的排列

查找具有相同顺序的所有可能排列或组合[关闭]

具有排列数组的通用合并排序