android 自定义view网格布局,可以设置列数

有时候做项目,需要自己去实现网格样式的布局,但是又不能直接使用gridView或者recyclerview。因为他们也有局限性。

实现效果

在这里插入图片描述


    private int columnNum = 2;
    private static int imageWidth = 0;
    private LinearLayout rowLinearlayout;
    int totalDividerWidth =30*3;

    /**
     * 设置所有间隔距离,方便计算item的宽度
     * @param totalDividerWidth
     */
    public void setTotalDividerWidth(int totalDividerWidth) {
        this.totalDividerWidth = totalDividerWidth;
    }

    /**
     * 设置列数
     *
     * @param columnNum
     */
    public void setColumnNum(int columnNum) {
        this.columnNum = columnNum;
    }

    public <T> void initGridList(final List<T> listBeans,IUpdateUIListener iUpdateUIListener) throws IllegalAccessException {
        if (columnNum==0){
            throw new IllegalAccessException("请设置列数!");
        }
        this.iUpdateUIListener = iUpdateUIListener;
        imageWidth = SystemUtils.getScreenWidth(getContext()) - totalDividerWidth;
        imageWidth = imageWidth / columnNum;
        removeAllViews();
        for (int i = 0; i < listBeans.size(); i++) {

            T t = listBeans.get(i);

            View item = initItemView(t);

            if (i % columnNum == 0) {
                rowLinearlayout = new LinearLayout(getContext());
                rowLinearlayout.setOrientation(HORIZONTAL);
                LayoutParams layout = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                layout.setMargins(30, 0, 0, 0);
                rowLinearlayout.setLayoutParams(layout);

                rowLinearlayout.addView(item);

                addView(rowLinearlayout);

            } else {
                //添加间隔线
                View view = new View(getContext());
                view.setLayoutParams(new LayoutParams(30, ViewGroup.LayoutParams.MATCH_PARENT));
                rowLinearlayout.addView(view);
                rowLinearlayout.addView(item);
            }

        }

    }
    private <T>View initItemView(T t){
        //获取子布局,设置宽度 高度

        View item = LayoutInflater.from(getContext()).inflate(R.layout.category_goods_item, null);
        LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(imageWidth, ViewGroup.LayoutParams.WRAP_CONTENT);
        item.setLayoutParams(linearParams);

        // 设置图片宽高 正方形
        ImageView imageView = item.findViewById(R.id.image);

        LinearLayout.LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams();
        layoutParams.width = imageWidth;
        layoutParams.height = imageWidth;

        imageView.setBackgroundColor(Color.parseColor("#F0EBE9"));
        imageView.setLayoutParams(layoutParams);

        TextView title = item.findViewById(R.id.title);
        TextView pTitle = item.findViewById(R.id.price);

        iUpdateUIListener.setItem(t, imageView, title, pTitle);


        return item;
    }

    IUpdateUIListener iUpdateUIListener;

    public interface IUpdateUIListener<T> {

        void setItem(T t, ImageView img, TextView title, TextView price);
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值