精华内容
下载资源
问答
  • php 商品数组分类

    千次阅读 2018-06-01 23:05:40
    假设现在有以下商品数组parentid=0为顶级分类其他的都是顶级或是二,三级的子类。 /** *商品类数组 */ function getData(){ $data=array( 0 => array ( 'cateid' => '1' , ...

    假设现在有以下商品数组parentid=0为顶级分类其他的都是顶级或是二,三级的子类。

    /**
     *商品类数组
     */
    function getData(){
    $data=array(
       0 =>
         array ( 'cateid' => '1' ,'title' => 'asd' ,'parentid' => '0' ,'createtime' =>  '1527845919' ),
      1 =>
        array ('cateid' =>  '2', 'title' =>  'ggg' , 'parentid' =>  '0','createtime' =>  '1527845936'),
      2 =>
        array ( 'cateid' =>  '3' ,'title' =>  'hhh' ,'parentid' =>  '1' ,'createtime' =>  '1527845951' ),
      3 =>
        array ( 'cateid' =>  '4' ,'title' =>  'vvv' , 'parentid' =>  '2' ,'createtime' =>  '1527845968' ),
      4 =>
        array ( 'cateid' =>  '5' ,'title' =>  'xxxx' ,'parentid' =>  '2' ,'createtime' =>  '1527846023' ),
      5 =>
        array ('cateid' =>  '6' ,'title' =>  'jjjjj' ,'parentid' =>  '1' ,'createtime' =>  '1527846031' ),
      6 =>
        array ('cateid' =>  '7' ,'title' =>  'iii' ,'parentid' =>  '1' ,'createtime' =>  '1527850236' ),
      7 =>
        array ('cateid' =>  '8' ,'title' =>  'iii^^^' ,'parentid' =>  '2' ,'createtime' =>  '1527850251' ),
      8 =>
        array ('cateid' =>  '9' ,'title' =>  'zzzz' ,'parentid' =>  '0' ,'createtime' =>  '1527859601' ),
      9 =>
        array ( 'cateid' =>  '10' ,'title' =>  '3333' ,'parentid' =>  '9' ,'createtime' =>  '1527859627' ),
      10 =>
        array ('cateid' =>  '11' ,'title' =>  'aaaa' , 'parentid' =>  '0' ,'createtime' =>  '1527859687' ),
      11 =>
        array ( 'cateid' =>  '12' ,'title' =>  'ssss' ,'parentid' =>  '11' ,'createtime' =>  '1527859712' ,),
      12 =>
        array ( 'cateid' =>  '13' ,'title' =>  'wearet' ,'parentid' =>  '11' ,'createtime' =>  '1527859768' ,),
      13 =>
        array ('cateid' =>  '14' ,'title' =>  'ooooo' ,'parentid' =>  '13' ,'createtime' =>  '1527860067' ,),
        );
    
        return $data;
    }
    
    
    /**
      *商品分类
      *
      */
    function getTree($cates, $pid = 0){
        $tree = [];
        foreach($cates as $cate){
            if($cate['parentid'] == $pid){
                //父类数组赋给$tree数组
                $tree[] = $cate;
                //找出子类 合并到复类
                $tree = array_merge($tree,getTree($cates, $cate['cateid']));
            }
        }
          return $tree;
    }
    
    /**
     *对分类级别加前缀 |-----
     */
    function setPrefix($data, $p = "|-----")
    {
            $tree = [];
            //类的层级数
            $num = 1;
            //前缀个数
            $prefix = [0 => 1];
            //current 输出数组中的当前元素的值
            while($val = current($data)){
                //key 从当前内部指针位置返回元素键名
                $key = key($data);
                //当走第二次循环时
                if ($key > 0) {
                    //如果上一次循环的parentid 不等于当前的 parentid,表示层级已经改变$num++
                    if ($data[$key - 1]['parentid'] != $val['parentid']){
                        //层级数++
                        $num ++;
                    }
                }
    
                //检查当前的父级ID是否存在$prefix数组里
                if (array_key_exists($val['parentid'], $prefix)){
                    //把父类ID赋给层级数(父类id多少表示多少级)
                    $num = $prefix[$val['parentid']];
                }
                //str_repeat 把字符串$p重复$num 次然后加上类名
                $val['title'] = str_repeat($p, $num).$val['title'];
                //
                $prefix[$val['parentid']] = $num;
                $tree[] = $val;
                //next 输出数组中的当前元素和下一个元素的值:
                next($data);
            }
    
            return $tree;
        }
    
    /**
      *列表列表
      */
    
    function getTreeList(){
            $data =getData();
            //分类查找出来的数据
            $tree =getTree($data);
            //给每个分类加 |--- 前缀然后返回数据
            return $tree =setPrefix($tree);
    }
        //
     $list=getTreeList();
     //打印出效果
     var_dump($list);

    最终的效果是:
    这里写图片描述

    展开全文
  • 因为没有其他人。不说这个,接着来说实现拿数据。 先把商品分类的页面数据传递好后,就会是一个比较满意的地基,可以参考图1,而真正抓狂的是数据传递,一开始,我已经拿到了,相应商品详情页的id,正在沾沾自喜,...

            现在是2020年4月13日  23:15。

            看到很多人需要源码,我就把源码分享到公众号上了,文章最后,扫码关注“DataShow Charts”,回复“商品详情”即可获取源码。

            原文章中写了一个比较麻烦且单一的方法,由于还会用于订单结算,所以,最好的是存在缓存中,然后再订单结算的时候还可以取出来,今天白天还在工作,是在晚上下班后,找到以前的源码,稍微修改了下,暂时先更新一版,大概这一周内吧,会写一个简单的商城小程序Demo,只是简单的流程“商品列表-》商品详情-》加入购物车-》结算”,其中具体的逻辑肯定能够都会完善。这周周末也会更新到公众号里,具体获取方法,公众号推送吧。

            公众号运营我是新手,内容不全,以前申请的号,很久都没更新,想着自己写的源码找个地方放一下,就想到了这个,还可以分享~~emmm~跑题了,拉回来~源码有什么问题的,可以直接公众号留言联系,我会每天看的~做到及时回复~~

            以下是原文章。        

    ————————————————————————————————————————————————————————

            首先,我不得不感慨下,慕课网上“7七月”老师的课真的很强大,此处放链接https://coding.imooc.com/learn/list/75.html

           我只是学习到了一半就开始自己尝试做一个商城的小程序,竟然真的被我完成了大部分。好吧,就这样,这个课明明还有一半,我竟然不听了……

            也不是不听,是我自己懒吧,能自己实现了,哈哈哈~这样还算是个好的结果吧。言归正传,最近几天都在做这个商品分类跳转到相应的商品详情页。

            港真,一开始我是把两个页面分开独立来做了,千万不要这样!千万不要这样!!千万不要这样!!!

            不然等到要拿数据的时候,你会哭的,我承认,我就急哭了好几次,你一个程序媛,难道没有人帮你解决么?呵呵哒……没有!因为没有其他人。不说这个,接着来说实现拿数据。

            先把商品分类的页面数据传递好后,就会是一个比较满意的地基,可以参考图1,而真正抓狂的是数据传递,一开始,我已经拿到了,相应商品详情页的id,正在沾沾自喜,动力十足,准备大干一场的时候,我发现,自己还是太天真了!

             怎么可能这么简单就拿得到全部数据呢?emmmmm……一边难过一边改代码,真是一次深刻又难忘的经历。

            先放图吧,不然我可能总会跑偏话题。

                                      图1                                                                                                                  图2

            以上这两张图分别是商品分类的html和js部分,我用了一个比较麻烦的方法,就是把所有的数据都传了过来,没有后台,如果有后台的话,只需要后台给我一个接口,我只需要传递一个id就完全ok~但目前只能先这样吧。

            突然发现,这篇文章完全没讲技术点,这可真的是……过分啊!

            具体来说,在实现过程中,需要注意的都是细节,比如传参的& =都不要忘了,后面几个我忘了,就一直出现“underfind”。拿到数据后,可以在商品详情页的js里打印出来,直接onLoad: function (options) {console.log(options);},就可以看到自己是否传递正确。

            由于我写数据的时候是一层一层的比较多,所以,拿数据的时候一定一定一定要看清楚数据所在的第几层数组。如果自己会有点迷糊的,那微信开发者工具调试器里的“AppData”和”Sources”了解下~真的很受用!

            好了,我得继续开始实现从加入购物车后,购物车页面的相应实现。虽然我现在已经实现了购物车结算、增减等,可是不能要死数据呀,得传!传数据~~~~

            不说了,接着干吧!

     

        扫码关注,回复“商品详情”即可获得本篇文章的源码~

    展开全文
  • 递归进行查询商品分类

    千次阅读 2019-05-13 20:04:21
    这两个字段,其他的字段名在这里讲没什么太大的意义。 递归的大体的思路就是 以根据id查询以它为父类id的所有商品分类数据,当此id下再无分类为退出条件,并返回递归所查出的数据。 serviceImpl的代码: @Overri...

    首先说一下商品分类(表名:product_categoy)数据库的结构,主要就是
    category_id:分类id
    parent_id:父类的ID(指的是同表中父类的id)
    这两个字段,其他的字段名在这里讲没什么太大的意义。

    递归的大体的思路就是 以根据id查询以它为父类id的所有商品分类数据,当此id下再无分类为退出条件,并返回递归所查出的数据。

    serviceImpl的代码:

    	@Override
        public List<TreeVO> findCategoryAndChild(Integer parentId) {
            //1.先查出以它为父类的子类
            List<ProductCategoryModel> productCategoryModelList = productCategoryMapper.findByParentId(parentId);
            //2.将数据进行递归  当datas为null的时候则表示没有下级  则推出
            return findChild(productCategoryModelList,parentId);
        }
    
    	/**
    	*TreeVO 只是用来封装数据的模型类  不用太在意这个
    	*/
        public List<TreeVO> findChild(List<ProductCategoryModel> byParentIds,Integer parentId) {
            ArrayList<TreeVO> treeVOS = new ArrayList<>();
            //退出条件  没有子类数据则退出
            if(byParentIds!=null){
            	//遍历传递过来这一级别的数据  获取id  根据id查询下一级
                for(ProductCategoryModel productCategoryModel:byParentIds){
                    //查出以此为父类的所有子类数据
                    List<ProductCategoryModel> byParentId = productCategoryMapper.findByParentId(productCategoryModel.getCategoryId());
                    	//进行数据封装   start
                        TreeVO treeVO = new TreeVO();
                        treeVO.setId(productCategoryModel.getCategoryId());
                        treeVO.setLabel(productCategoryModel.getCategoryName());
                        treeVO.setParentId(productCategoryModel.getParentId());
                        //判断  如果这条数据的parentId与传递过来的parentId相等则添加进childList中
                        if(productCategoryModel.getParentId()==parentId){
                            //并进行 递归操作
                            treeVO.setChildren(findChild(byParentId,productCategoryModel.getCategoryId()));
                        }
                        //进行数据封装   end
                        treeVOS.add(treeVO);
                    }
                return treeVOS;
            }
            return treeVOS;
        }
    
    展开全文
  • 电商开发之商品属性分类

    千次阅读 2017-01-03 12:15:44
    前一段时间一直在忙其他项目,没有时间发博客,今天闲下来,发一下之前写过的电商开发商品属性分类的功能,借鉴大神的逻辑,适配器的写法和大神的基本你一样 ... 基本看起来,实在不明白activity或者fragment里边该怎么...

    前一段时间一直在忙其他项目,没有时间发博客,今天闲下来,发一下之前写过的电商开发商品属性分类的功能,借鉴大神的逻辑,适配器的写法和大神的基本你一样

    http://blog.csdn.net/u010924834/article/details/50353955

    基本看起来,实在不明白activity或者fragment里边该怎么写,思路断断续续,太难掌控了,没办法,谁让我是菜鸟呢,只能慢慢想,慢慢整理逻辑了,用了将近三天时间终于吧这个弄出来了,先看下数据吧

    {
      "data": [
        {
          "content": "红色,黑色,白色,蓝色,粉色,紫色,彩色,花白色,藏青色,黑白色,卡其色,粉红色,亮白色,浅灰色,玫瑰红,黄色,蓝色,绿色,金色,嫩黄色",
          "title": "颜色"
        },
        {
          "content": "34,34,39,41,10,49,43,48,12,42,68",
          "title": "尺码"
        },
        {
          "content": "M,L,S,XL,XXL,XXXL,X,XX,XXX,XXXXL,XXXX,LL,SS,MM",
          "title": "样式"
        }
      ]
    }
    这是分类的json数据

    然后再看下适配器吧

    package com.demo.demo_gridview;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by 小明 on 2016/11/1.
     */
    public class GoodSelectAdapter extends MyBaseAdapter<List<Map<String, Object>>> {
    
        //用于保存用户的属性集合
        private Map<String, String> selectProMap = new HashMap();
        private int index = 1;
        private ArrayList<HashMap<String, TextView[]>> mViewList;
    
        private OnTextClickListener listener;
    
        public GoodSelectAdapter(OnTextClickListener listener, Context context, List<Map<String, Object>> datas, Map<String, String> hashmap) {
            super(context, datas);
            this.selectProMap = hashmap;
            mViewList = new ArrayList<>();
            this.listener = listener;
        }
    
        @Override
        public View getViewDatas(int position, View convertView, ViewGroup parent) {
    
            index++;
            Log.i("aaa", index + "");
            ViewHolder holder = null;
            if (convertView == null) {
                // 获取list_item布局文件的视图
                convertView = LayoutInflater.from(context).inflate(R.layout.tag_item, null, true);
                holder = new ViewHolder();
                // 获取控件对象
                holder.tvPropName = (TextView) convertView.findViewById(R.id.tv_property_name);
                holder.vgPropContents = (MyViewGroup) convertView.findViewById(R.id.myviewgroup);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            if (this.datas != null) {
                ArrayList<String> lables = (ArrayList<String>) datas.get(position).get("lable");
                String type = (String) datas.get(position).get("type");
                holder.tvPropName.setText(type);//规格名称
                //动态加载标签
                //判断布局中的子控件是否为0,如果不为0,就不添加了,防止ListView滚动时重复添加
                if (holder.vgPropContents.getChildCount() == 0) {
                    TextView[] textViews = new TextView[lables.size()];
                    //设置每个标签的文本和布局
                    for (int i = 0; i < lables.size(); i++) {
                        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                        params.setMargins(15, 15, 15, 0);
                        TextView textView = new TextView(context);
                        textView.setGravity(17);
                        textView.setPadding(25, 15, 25, 15);
                        textView.setLayoutParams(params);
                        textViews[i] = textView;
                        textViews[i].setBackgroundResource(R.color.white);
                        textViews[i].setText(lables.get(i));
                        textViews[i].setTag(i);
                        holder.vgPropContents.addView(textViews[i]);
                    }
                    //绑定标签的Click事件
                    for (int j = 0; j < textViews.length; j++) {
                        textViews[j].setTag(textViews);
                        textViews[j].setOnClickListener(new LableClickListener(type));
                    }
                }
                /**判断之前是否已选中标签*/
                if (selectProMap.get(type) != null) {
                    for (int h = 0; h < holder.vgPropContents.getChildCount(); h++) {
                        TextView v = (TextView) holder.vgPropContents.getChildAt(h);
                        if (selectProMap.get(type).equals(v.getText().toString())) {
                            v.setBackgroundColor(Color.parseColor("#EE5500"));
                            v.setTextColor(Color.parseColor("#FFFFFF"));
                            selectProMap.put(type, v.getText().toString());
                        }
                    }
                }
            }
            return convertView;
        }
    
        /*定义item对象*/
        public class ViewHolder {
    
            TextView tvPropName;
            MyViewGroup vgPropContents;
        }
    
        class LableClickListener implements View.OnClickListener {
            private String type;
    
            public LableClickListener(String type) {
                this.type = type;
            }
    
            @Override
            public void onClick(View v) {
                TextView[] textViews = (TextView[]) v.getTag();
                TextView tv = (TextView) v;
                for (int i = 0; i < textViews.length; i++) {
                    //让点击的标签背景变成橙色,字体颜色变为白色
                    if (tv.equals(textViews[i])) {
                        textViews[i].setBackgroundColor(Color.parseColor("#EE5500"));
                        textViews[i].setTextColor(Color.parseColor("#FFFFFF"));
                        selectProMap.put(type, textViews[i].getText().toString());
                        listener.onClick(type, textViews[i].getText().toString());
                    } else {
                        //其他标签背景变成白色,字体颜色为黑色
                        textViews[i].setBackgroundResource(R.color.white);
                        textViews[i].setTextColor(Color.parseColor("#000000"));
                    }
                }
    
            }
    
        }
    
        public interface OnTextClickListener{
            void onClick(String title, String text);
        }
    
    }
    
    基本上就是照搬大神的源码了,说明一下,之所以写一个回调接口

        public interface OnTextClickListener{
            void onClick(String title, String text);
        }
    是因为我这边的服务器是仿照京东写的,在开始进来的时候需要给服务器的分类数据必须是
    颜色:白色,尺码,23,演示:xxl
    所以需要拼接了,而大神写出来的,点击之后显示的只是一个类别,比如点击红色,他就会显示红色,而viewgroup则不是是用的他写出来的,而是是用的鸿洋大神的自定义viewgroup

    http://blog.csdn.net/lmj623565791/article/details/38352503/

    子所以不是用他写的,相信体验过的程序员已经测试过了,他写出来的viewgroup显示的分类一个是不全,还需要改动viewgroup里边的代码,我记得是在onMeasure()里边计算viewgroup的高度的时候需要在他计算的高度上再加上75,这样看起来还算是可以吧,不过属性名和属性分类的间距太大了,至于怎么修改,我完全懵逼了,没办法本菜只能再去找去他的viewgroup了,

    package com.demo.demo_gridview;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by 小明 on 2016/12/7.
     */
    
    public class MyViewGroup extends ViewGroup {
    
        private static final String TAG = "FlowLayout";
    
    
        public MyViewGroup(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected ViewGroup.LayoutParams generateLayoutParams(
                ViewGroup.LayoutParams p) {
            return new MarginLayoutParams(p);
        }
    
        @Override
        public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
            return new MarginLayoutParams(getContext(), attrs);
        }
    
        @Override
        protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
            return new MarginLayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT);
        }
    
        /**
         * 负责设置子控件的测量模式和大小 根据所有子控件设置自己的宽和高
         */
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            // 获得它的父容器为它设置的测量模式和大小
            int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
            int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
            int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
            int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
    
            Log.e(TAG, sizeWidth + "," + sizeHeight);
    
            // 如果是warp_content情况下,记录宽和高
            int width = 0;
            int height = 0;
            /**
             * 记录每一行的宽度,width不断取最大宽度
             */
            int lineWidth = 0;
            /**
             * 每一行的高度,累加至height
             */
            int lineHeight = 0;
    
            int cCount = getChildCount();
    
            // 遍历每个子元素
            for (int i = 0; i < cCount; i++) {
                View child = getChildAt(i);
                // 测量每一个child的宽和高
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
                // 得到child的lp
                MarginLayoutParams lp = (MarginLayoutParams) child
                        .getLayoutParams();
                // 当前子空间实际占据的宽度
                int childWidth = child.getMeasuredWidth() + lp.leftMargin
                        + lp.rightMargin;
                // 当前子空间实际占据的高度
                int childHeight = child.getMeasuredHeight() + lp.topMargin
                        + lp.bottomMargin;
                /**
                 * 如果加入当前child,则超出最大宽度,则的到目前最大宽度给width,类加height 然后开启新行
                 */
                if (lineWidth + childWidth > sizeWidth) {
                    width = Math.max(lineWidth, childWidth);// 取最大的
                    lineWidth = childWidth; // 重新开启新行,开始记录
                    // 叠加当前高度,
                    height += lineHeight;
                    // 开启记录下一行的高度
                    lineHeight = childHeight;
                } else
                // 否则累加值lineWidth,lineHeight取最大高度
                {
                    lineWidth += childWidth;
                    lineHeight = Math.max(lineHeight, childHeight);
                }
                // 如果是最后一个,则将当前记录的最大宽度和当前lineWidth做比较
                if (i == cCount - 1) {
                    width = Math.max(width, lineWidth);
                    height += lineHeight;
                }
    
            }
            setMeasuredDimension((modeWidth == MeasureSpec.EXACTLY) ? sizeWidth
                    : width, (modeHeight == MeasureSpec.EXACTLY) ? sizeHeight
                    : height);
    
        }
    
        /**
         * 存储所有的View,按行记录
         */
        private List<List<View>> mAllViews = new ArrayList<List<View>>();
        /**
         * 记录每一行的最大高度
         */
        private List<Integer> mLineHeight = new ArrayList<Integer>();
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            mAllViews.clear();
            mLineHeight.clear();
    
            int width = getWidth();
    
            int lineWidth = 0;
            int lineHeight = 0;
            // 存储每一行所有的childView
            List<View> lineViews = new ArrayList<View>();
            int cCount = getChildCount();
            // 遍历所有的孩子
            for (int i = 0; i < cCount; i++) {
                View child = getChildAt(i);
                MarginLayoutParams lp = (MarginLayoutParams) child
                        .getLayoutParams();
                int childWidth = child.getMeasuredWidth();
                int childHeight = child.getMeasuredHeight();
    
                // 如果已经需要换行
                if (childWidth + lp.leftMargin + lp.rightMargin + lineWidth > width) {
                    // 记录这一行所有的View以及最大高度
                    mLineHeight.add(lineHeight);
                    // 将当前行的childView保存,然后开启新的ArrayList保存下一行的childView
                    mAllViews.add(lineViews);
                    lineWidth = 0;// 重置行宽
                    lineViews = new ArrayList<View>();
                }
                /**
                 * 如果不需要换行,则累加
                 */
                lineWidth += childWidth + lp.leftMargin + lp.rightMargin;
                lineHeight = Math.max(lineHeight, childHeight + lp.topMargin
                        + lp.bottomMargin);
                lineViews.add(child);
            }
            // 记录最后一行
            mLineHeight.add(lineHeight);
            mAllViews.add(lineViews);
    
            int left = 0;
            int top = 0;
            // 得到总行数
            int lineNums = mAllViews.size();
            for (int i = 0; i < lineNums; i++) {
                // 每一行的所有的views
                lineViews = mAllViews.get(i);
                // 当前行的最大高度
                lineHeight = mLineHeight.get(i);
    
                Log.e(TAG, "第" + i + "行 :" + lineViews.size() + " , " + lineViews);
                Log.e(TAG, "第" + i + "行, :" + lineHeight);
    
                // 遍历当前行所有的View
                for (int j = 0; j < lineViews.size(); j++) {
                    View child = lineViews.get(j);
                    if (child.getVisibility() == View.GONE) {
                        continue;
                    }
                    MarginLayoutParams lp = (MarginLayoutParams) child
                            .getLayoutParams();
    
                    //计算childView的left,top,right,bottom
                    int lc = left + lp.leftMargin;
                    int tc = top + lp.topMargin;
                    int rc = lc + child.getMeasuredWidth();
                    int bc = tc + child.getMeasuredHeight();
    
                    Log.e(TAG, child + " , l = " + lc + " , t = " + t + " , r ="
                            + rc + " , b = " + bc);
    
                    child.layout(lc, tc, rc, bc);
    
                    left += child.getMeasuredWidth() + lp.rightMargin
                            + lp.leftMargin;
                }
                left = 0;
                top += lineHeight;
            }
    
        }
    
    }
    
    这就是鸿洋大神的代码了,至于怎么去计算的,别来问我,因为我也不会,怎么自定义viewgroup,还是推荐鸿洋大神的博客

    http://blog.csdn.net/lmj623565791/article/details/38339817

    感兴趣的刻意去看看,很不错的

    废话不多说了。上activity代码,其他的都可以找打,唯独activity里边的代码是没有的,可怜的我搞了三天才能完全运行啊,本菜好可怜,你们也不给我个赞哭

    package com.demo.demo_gridview;
    
    import android.content.Context;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.WindowManager;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import com.google.gson.Gson;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by 小明 on 2016/12/6.
     */
    
    public class StartActivity extends AppCompatActivity implements GoodSelectAdapter.OnTextClickListener {
    
        //数据实体类
        private ShopDeialResponseDto responseDto;
        //数据集合
        private List<ShopDeialResponseDto.DataEntity> datas;
        private Context context;
        //父布局
        private LinearLayout activity_main;
        //需要上传服务器  请求图片属性的集合
        private Map<String, String> hashmap = new HashMap<>();;
        //适配器
        private GoodSelectAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            context = this;
            setContentView(R.layout.activity_main);
            //沉浸式   请忽略
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
                localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
            }
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            if (toolbar != null) {
                setSupportActionBar(toolbar);
            }
            //绑定控件
            activity_main = (LinearLayout) findViewById(R.id.activity_main);
            datas = new ArrayList<>();
            //解析json
            String json = FileUtils.getJson("commodity.json", this);
            responseDto = new Gson().fromJson(json, ShopDeialResponseDto.class);
            //数据添加
            setDatas();
        }
    
        private void setDatas() {
            //得到数据
            datas = responseDto.getData();
            String content[] = new String[datas.size()];
            //吧数据拆分成三个数据 因为只有三条json数据
            for (int i = 0; i < datas.size(); i++) {
                content[i] = datas.get(i).getContent();
            }
            //对数组进行拆分
            for (int j = 0; j < content.length; j++) {
                Map<String, Object> map = new HashMap<>();
                //添加属性标题
                map.put("type", datas.get(j).getTitle());
                //拆分字符串  得到一个新的数组
                String str[] = (content[j].split(","));
                List<String> list1 = new ArrayList();
                //循环数组  得到一个新的listview需要的集合
                for (int i = 0; i < str.length; i++) {
                    list1.add(str[i]);
                    //添加属性集合
                    parameter.put(datas.get(j).getTitle(), datas.get(j).getTitle() + ":" + list1.get(0));
                }
                //添加属性内容
                map.put("lable", list1);
                List<Map<String, Object>> list = new ArrayList<>();
                list.add(map);
    //            RecyclerView recyclerView = new RecyclerView(context);
    //            adapter1 = new HomeAdapter(context, list, hashmap);
                ListView listView = new ListView(context);
                adapter = new GoodSelectAdapter(this, context, list, hashmap);
                listView.setAdapter(adapter);
                activity_main.addView(listView);
            }
    
            String property = null;
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < parameter.size(); i++) {
                if (i == parameter.size() - 1) {
                    property = sb.append(parameter.get(datas.get(i).getTitle())).toString();
                } else {
                    property = sb.append(parameter.get(datas.get(i).getTitle()) + ",").toString();
                }
            }
            Toast.makeText(context, property.toString(), Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 服务器需要的数据是一个string字符串
         * 颜色:白色,尺码,23,演示:xxl
         * @param title
         * @param text
         */
        //属性集合
        private Map<String, String> parameter = new HashMap<>();
        @Override
        public void onClick(String title, String text) {
            parameter.put(title, title + ":" + text);
            StringBuffer property = new StringBuffer();
            for (int i = 0; i < parameter.size(); i++) {
                if (i == parameter.size() - 1) {
                    property.append(parameter.get(datas.get(i).getTitle()));
                } else {
                    property.append(parameter.get(datas.get(i).getTitle()) + ",");
                }
            }
            Toast.makeText(context, property.toString(), Toast.LENGTH_SHORT).show();
        }
    }
    
    因为是单独写出来的一个项目,所以吧json数据写在了assets里边,里边有一段这样的代码
            //沉浸式   请忽略
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
                localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
            }
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            if (toolbar != null) {
                setSupportActionBar(toolbar);
            }
    这是本菜在测试沉浸式,请忽略就好,如果有人也想试试沉浸式,建议吧build.gradle里边的v7包改成22.2.。0以上的
        compile 'com.android.support:appcompat-v7:22.2.1'
    
    其中的一个方法
        /**
         * 服务器需要的数据是一个string字符串
         * 颜色:白色,尺码,23,演示:xxl
         * @param title
         * @param text
         */
        //属性集合
        private Map<String, String> parameter = new HashMap<>();
        @Override
        public void onClick(String title, String text) {
            parameter.put(title, title + ":" + text);
            StringBuffer property = new StringBuffer();
            for (int i = 0; i < parameter.size(); i++) {
                if (i == parameter.size() - 1) {
                    property.append(parameter.get(datas.get(i).getTitle()));
                } else {
                    property.append(parameter.get(datas.get(i).getTitle()) + ",");
                }
            }
            Toast.makeText(context, property.toString(), Toast.LENGTH_SHORT).show();
        }
    则是适配器的回调接口里边重写的方法了,返回数据,在activity里边进行操作。当然activity要实现adapter里边的ontextClickListener接口了。

    基本上就是这样了,如果还有不明白的,或者更好地方法,请告诉我,谢谢,顺便求点赞,谢谢!!

    项目地址:http://download.csdn.net/detail/sinat_29874521/9708583

    展开全文
  • 商城-实现商品分类查询

    千次阅读 2019-06-13 15:20:58
    实体5.3.3.controller5.3.4.service5.3.5.mapper5.3.6.启动并测试 5.实现商品分类查询 商城的核心自然是商品,而商品多了以后,肯定要进行分类,并且不同的商品会有不同的品牌信息,其关系...
  • 使用RecyclerView商品左右分类列表

    千次阅读 2017-03-02 20:25:19
    最近自己想写一个购物App 所以就模仿着网易严选的样式去写 今天刚好也写到分类这一块 看着这样的样式前面自己是想用两个LIstView去完成 后面想了想打算用 RecyclerView写 ,然后在百度上找了一些dome 。...
  • 商品分类与编码

    千次阅读 2008-01-07 10:31:00
    商品分类与编码 第一节 商品分类的概念和作用 一、商品的基本概念 商品是指用来交换、能满足人们某种需要的劳动产品。一切商品都具有使用价值和价值两种属性。商品的二重性是由劳动的二重性决定的,即具体劳动产生...
  • 商品分类表的设计

    千次阅读 2010-01-29 13:00:00
    闲来无事思考了下电子商务中最常遇到的商品...商品分类表的设计1 数据库设计 最常用的2个表,简单字段1.1 分类表 Code编码规则第一层2位10-99其他层3位 100-9991.2 商品信息表 Keywords字段用于商品的搜索Belong_
  • 实现商品分类和品牌管理功能

    千次阅读 2020-02-23 15:27:23
    文章目录一、实现商品分类管理1.1 导入数据1.2 实体1.3 controller1.4 service1.5 mapper1.6.启动并测试二、跨域问题2.1 cors解决跨域2.1.1 简单请求2.1.2 特殊请求2.2 cors跨域的实现过程三、实现商品品牌管理3.1...
  •  这段时间一直在进行开发商城的APP(Android和IOS),也研究一下国内绝大多数的电商APP(例如:淘宝,京东,天猫,苏宁易购,顺丰优选等等),他们的商品分类其实大多数属于常见格调:列表-点击二级列表-具体三级分类列表
  • 完善商品分类导航

    千次阅读 2004-10-14 10:55:00
    完善商品分类导航 作者:abin 时间:2004.10.14 出处:http://blog.csdn.net/abinstudio在上一次商品导航的分析(《建立合理的商品类与导航》)中建立了两
  • 第六章 用车类商品发布规范 第二十三条本章所规定的内容,适用于发布在“接送机/专车接送/旅游包车”、“租车/租车自驾游”类目的商品。 第二十四条商家发布商品标题应遵守以下规定,违反以下任一规定皆视为一般...
  • 第八章 国外景点门票类商品发布规范 第一节 发布规范 第三十一条本章所规定的内容,适用于发布在“国外票务(景点/赛事/演出)”类目的商品。 第三十二条商家发布商品标题应遵守以下规定,商家违反任一规定...
  • 第二章 自由行及跟团游类商品发布规范 第五条本章所规定的内容,适用于发布在“自由行/跟团游”、“境外一日游/多日游”、“境外玩乐套餐”类目的商品。 第六条商家发布商品标题及线路亮点应遵守以下规定,违反...
  • scrapy爬取京东商城某一类商品的信息和评论(一)

    万次阅读 热门讨论 2016-07-06 17:28:18
    一、前提 默认已用scrapy爬取过网站,有爬虫基础,有爬虫环境 二、以爬取电子烟为例 1、任务一:爬取商品信息 ...在搜索框里面直接搜索电子烟,搜出来的界面...后来发现,从京东左边的商品分类中找到电子烟这一分类
  • 一、商品状态流转:新建(待进货)、待售(入库后)、上架(在售)、下架(停售),在商品状态的流转中,有这4个状态足矣。 根据业务,需要从多个维度了解商品,用新字段标记,其实一个字段就是一个维度: 1.是否...
  • 网上流传了很多版本的弹窗,但基本都是基于popWindow,Spinner,或者直接覆盖一层Dialog,大多用户必须手点把外层的弹窗点掉,才能选择其他种类的分类放,逼死强迫 症有木有。 捣鼓了一番,效果如下 ...
  • 【SSH网上商城项目实战10】商品类基本模块的搭建

    万次阅读 多人点赞 2016-05-11 09:03:28
    前面我们完成了与商品类别相关... 首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model,表如下:   /*=============================*/ /* Table: 商品表结构 */ /*=======================...
  • 目录 一、环境 二、简介 三、京东网页分析 1.获取商品信息入口--商品列表链接获取 2.获取商品信息入口--商品详情链接获取 ...3.商品详情获取 ...4.商品评论获取 ... 抓取京东商品页面信息:商品名称,...
  • 根据输入的年份、产品类型和随机数... 其他): …… 生成3位随机数 最后显示固定资产编号 提示:3位随机数按如下方法产生: (int)(Math.random()*1000); random方法API介绍: 实现代码: package com.str...
  • 商品分类的删除:1.删除自己以及后代节点(递归删除)2.判断有没有兄弟节点,没有兄弟节点,父节点的isparent设置为false(当然还得判断自己是不是根节点)删除的主方法,在主方法里调用递归public int ...
  • 要求实现的功能是左侧展示分类名,右侧展示商品,点击任意分类可以跳转分类所包含的商品的第一个,滑动商品列表至下一分类时左侧所属分类高亮。 思路 首先实现点击左侧分类右侧商品滑动,这里使用小程序提供的 ...
  • 在OFBIZ中商品的管理是由目录管理应用(Catalog)来完成的。从后台商品上下架到前台商品展示,都由这一应用来管理。本文重点放在讲解如何发布商品,并在前台进行展示。我们以鞋子为例子,以品种和品牌两个方面进行讲解...
  • 【微信小程序】仿京东商品分类界面

    万次阅读 热门讨论 2017-12-20 17:04:11
    2、商品根据不同数量自适应排列 → flex-wrap的应用 3、切换左侧导航后,右侧显示对应变化,且默认显示在顶部位置 → scroll-view标签,设置scroll-top值为0 代码: <!--分类导航栏--> !=...
  • 一、首先,静态页面不需要自己写。找各种素材图片,需要自己做也行,但一定不如前台开发者做的精美。 个人更喜欢 用比较流行...这里商品product表,和商品分类category表 关系:product依赖category,表里有外建:pid。
  • 既然是到详细设计阶段...对于这种情况,我之前看过一些开发的做法,都是用一个来描述,在列表页面显示商品的时候,就把商品的所有信息都查了出来,只是前端在展示的时候,只选择一部分信息展示。但是一个商品的详...
  • 一起来学习Vue把,这篇博客是关于商品分类,请多指教~ 2、商品分类篇 2.1 通过路由加载商品分类组件 2. 2 绘制商品分类组件的基本页面布局 <template> <div> <!--面包屑导航区--> <el-...
  • vue前端之基于Vant-ui的树形商品分类选择(TreeSelect) vant-ui地址:https://youzan.github.io/vant-weapp/#/intro 或者点击这里跳转 相关vant-ui的安装配置都见以上网址。 1、要实现的效果 效果就是通过点击...
  • 商品分类:数据唯一,且一次性全部拿取,使用Set(集合)进行缓存 商品列表:数据具备排序支持,使用SortedSet(有序集合)进行缓存 商品详情:准确定位获取数据信息,使用Hash(哈希表)进行缓存

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 153,525
精华内容 61,410
关键字:

其他类商品