RecycleView实现网格不一样的排列布局

需求原型图

这次的需求和普通网格布局方式是不一样的,这个是先从左边排满8个,之后再从右边排。
普通recycleView的排列方式是左右左右排的。

RecycleView实现网格不一样的排列布局_第1张图片

两种途径可实现这种方式:
第一是自定义layoutmanger,这个不会,哭晕。第二种就是重新组装数据,这个倒是会,就是有点麻烦。

RecycleView实现网格不一样的排列布局_第2张图片
所以难点就集中体现在:
第一,如何重新组装数据
第二,每条item的底部bottom线如何去掉,可能有人认为是最后一条数据,其实不是,按照新的组装方式之后,比如上图,索引值是11和14的时候,下划线才去掉。

实现方式

数据组装:

比如实际获得的数据是14,都要组装成16条,也就是要在这14条数据中插入两条空的数据,空的数据插入的索引值是13和15,这样才会呈现上述的排列方式。同理如果是8条数数据,就要插入8条空的数据,缺多少,补多少,不过索引值一定要搞对。

 private ArrayList<MessageRecipeData.MainMaterialsBean> newBeas = new ArrayList<>();
//判断数据是否大于8
            if (data.size() <= 8) {
                for (int i = 0; i < 16; i++) {
                    if (i % 2 == 0) {//索引为偶
                        int index = i / 2;
                        if (index <= data.size() - 1) {//装配原有数据
                            newBeas.add(data.get(index));
                        } else {//填充
                            newBeas.add(new MessageRecipeData.MainMaterialsBean("", "",false));
                        }
                    } else {//奇数索引值填充
                        newBeas.add(new MessageRecipeData.MainMaterialsBean("", "",false));
                    }
                }
                Timber.d("newBeas size %d", newBeas.size());
                mAdapter.setNewData(newBeas);
            } else {//超过8条数据,偶数项都是有数据
                int others = data.size() - 8;//多出的
                int j = 1;
                for (int i = 0; i < 16; i++) {
                    if (i % 2 == 0) {
                        int index = i / 2;
                        if (index <= data.size() - 1) {
                            newBeas.add(data.get(index));
                        }
                    } else {//奇数项填充
                        if (others > 0) {
                            newBeas.add(data.get(j + 7));
                            others--;
                            j++;
                        } else {
                            newBeas.add(new MessageRecipeData.MainMaterialsBean("", "",false));
                        }
                    }
                    mAdapter.setNewData(newBeas);
                }
            }
去掉末尾item的底部bottom线

在这里需要注意,因为数据是组装过的,所以拿到的数据都是满满的,外部一定要传一个没组装之前的数据实际大小:

  private int realSize;//实际数据大小(没组装数据之前的大小)

    public RecipeMaterialAdapter(int layoutResId,int realSize) {
        super(layoutResId);
        this.realSize = realSize;
    }

//代码中判断的数据有超过16条,是因为这里有一个轮播控件,里面装载的是recycleview。
 @Override
    protected void convert(BaseViewHolder helper, MessageRecipeData.MainMaterialsBean item) {
        String name = item.getName();
        if(TextUtils.isEmpty(name)){
            helper.setVisible(R.id.view_line,false);
        }else{
            helper.setVisible(R.id.view_line,true);
        }
        int adapterPosition = helper.getAdapterPosition();
        //如果数据<=8
        if(realSize<=8){
            if(adapterPosition==realSize-1){
                Timber.d("单一布局方式,不显示");
                helper.setVisible(R.id.view_line,false);
            }
        }else if(realSize<=16){//没有排满
            int leftSize = realSize-8;
            if(adapterPosition==leftSize*2-1||adapterPosition==14){
                helper.setVisible(R.id.view_line,false);
            }
        }else if(realSize<=24){//数据超过16条的,比如19条
            int others = realSize-16;
            if(adapterPosition==others*2-2||adapterPosition==14||adapterPosition==15){
                helper.setVisible(R.id.view_line,false);
            }
        }else if(realSize<=32){//如果数据超过24条,比如25条
            int leftSize = realSize-24;
            if(adapterPosition==leftSize*2-1||adapterPosition==14){
                helper.setVisible(R.id.view_line,false);
            }
        }else if(realSize<=40){//数据超过40条
            int others = realSize-32;
            if(adapterPosition==others*2-2||adapterPosition==14||adapterPosition==15){
                helper.setVisible(R.id.view_line,false);
            }
        }else{
            int leftSize = realSize-40;
            if(adapterPosition==leftSize*2-1||adapterPosition==14){
                helper.setVisible(R.id.view_line,false);
            }
        }
        helper.setText(R.id.tv_name, name)
                .setText(R.id.tv_amount,item.getAmount());
    }

效果图

RecycleView实现网格不一样的排列布局_第3张图片
RecycleView实现网格不一样的排列布局_第4张图片
RecycleView实现网格不一样的排列布局_第5张图片

你可能感兴趣的:(Android控件)