Android 选择商品属性sku

Android 选择商品属性sku

最近项目中使用SKU属性查询,类似淘宝京东商品的选择,在网上查询了弄了几个源码看看,发现还是实现不了多属性选择问题,再原基础上改动相当费事,所以想干脆自己处理这个问题,而多种熟悉问题貌似没有人分享,所以写出来思路,具体重点方法,提供给需要的人:

本次写出的三个属性,如果需要更多属性,耐心参照此Demo一定可以写出,此Demo还未完成全部,比如动态如果只有2个属性的时候,一个属性的时候,都未作出自动调整,此次只作记录,希望可以给大家提供一种思路

首先来看看效果图

这里写图片描述

相信效果图,已一目了然,选择其中的属性,来动态改变状态,置灰 ,不可点击等。

第一步,先说数据问题

这个数据刚开始讨论挺复杂,第一种方案

{
"id":"1233",
"color":"红色",
"size":"38",
"style":"男",
"stock_count":"9"
},
{
"id":"12332",
"color":"红色",
"size":"39",
"style":"男",
"stock_count":"0",
}

每一个款需要存ID,颜色,大小,款式,库存,
写了一段代码,发现这些数据其实在更新Sku属性查询的效果上没有使用,所以后台数据根据前端实现进行了调整。调整后的数据结果大致为

{
"0-0-0","9-12341",
"0-1-0","0-12332",
}

相信大家都看懂了,key调整为下标,value为库存-商品ID
为什么这么调整,后面你就能知道了。

第二步说说UI了

按钮肯定为动态生成,而这个排序其实也有规律,一个属性含有多个值,每一个属性只可单选 每种属性只能选中一个,如果,属性我用下标0开始,那么3种属性,就会有 0 ,1 ,2三个值了,看到这里 你应该知道为什么数据用数字来标识了吧,通过下标来判断按钮。
而每个属性里,0-1,0-2,0-3,0-4,0-5,…..
这样三种属性的按钮对应的标识自然就出来了 ,

0-0,0-1,0-2,0-3,0-4
1-0,1-1,1-2,1-3,1-4
2-0,2-1

第三步,开始撸了

说说绘制方法,走过不少弯路,哎,直接说说最无奈的方法,
每一次点击需要把所有的按钮状态全部刷新,记住这个了,始终当时我没跳出来

这里写图片描述

贴出方法吧,

   /**
     * 点击某个后产生的新SurplusList
     * @param tag 按钮的属性
     * @return
     */
 private List<GoodStock> initSurplusList(String tag) {
        List<GoodStock> surplusList = new ArrayList<GoodStock>();
        if (toTextViewTagToRows(tag).equals("0")) {
            for (GoodStock stock : mList) {
                if (stock.getKey().startsWith(toTextViewTagToColumns(tag))) {
                    surplusList.add(stock);
                }
            }
        } else if (toTextViewTagToRows(tag).equals("1")) {
            for (GoodStock stock : mList) {
                if (toAttrMiddleColumns(stock.getKey()).equals(toTextViewTagToColumns(tag))) {
                    surplusList.add(stock);
                }
            }
        } else if (toTextViewTagToRows(tag).equals("2")) {
            for (GoodStock stock : mList) {
                if (stock.getKey().endsWith(toTextViewTagToColumns(tag))) {
                    surplusList.add(stock);
                }
            }
        }
        return surplusList;
    }

这里应该不需要解释了,根据点击按钮属性,代入算出对应的List

接下来,刷新按钮了,这个地方坑太多了

  private void onRefreshAllTextView(List<GoodStock> surplusList, TextView mTextView) {
        //开始遍历
        for (TextView TextView : TextViewList) {
            String nTag = TextView.getTag().toString();
            String nSelTag = mTextView.getTag().toString();
            //已经选中一个
            if (selectTextView.size() == 1) {
                if (!toTextViewTagToRows(nTag).equals(toTextViewTagToRows(nSelTag))) {
                    //不同一行 在剩下的交集里刷新剩下的按钮
                    onOneRefreshTextView(surplusList, TextView);
                }

            } else if (selectTextView.size() == 2) {
                TextView selOneTextView = selectTextView.get(0);
                TextView selTwoTextView = selectTextView.get(1);
                String selOneTextViewTag = selOneTextView.getTag().toString();
                String selTwoTextViewTag = selTwoTextView.getTag().toString();
                //当前点击的按钮。得到对应的List
                if (!toTextViewTagToRows(nTag).equals(toTextViewTagToRows(selTwoTextViewTag))) {
                    surplusList = initSurplusList(selTwoTextViewTag);
                } else {
                    surplusList = initSurplusList(selOneTextViewTag);
                }
                onTwoRefreshTextView(surplusList, TextView);
            } else if (selectTextView.size() == 3) {
                onLastRefreshTextView(TextView);
            }
        }
    }

思路就是 只有一个选中时,去掉重复选中的,然后去onOneRefreshTextView刷新按钮,
第一个按钮刷新方法 我也贴出来了,

   /**
     * 刷新按钮
     *
     * @param surplusList 选中条件后的集合
     * @param TextView    每一个按钮
     */
    private void onOneRefreshTextView(List<GoodStock> surplusList, TextView TextView) {

        String TextViewTag = TextView.getTag().toString();
        //选中按钮的行数
        String mRows = toTextViewTagToRows(TextViewTag);
        String mColumns = toTextViewTagToColumns(TextViewTag);//选中按钮的列
        //不在一行
        for (GoodStock stock : surplusList) {
            String stockKey = stock.getKey();
            if (mRows.equals("0")) {
                if (toAttrStartColumns(stockKey).equals(mColumns)) {
                    TextView.setEnabled(true);
                    break;
                } else {
                    TextView.setEnabled(false);
                }
            } else if (mRows.equals("1")) {
                if (toAttrMiddleColumns(stockKey).equals(mColumns)) {
                    TextView.setEnabled(true);
                    break;
                } else {
                    TextView.setEnabled(false);
                }
            } else if (mRows.equals("2")) {
                if (toAttrLastColumns(stockKey).equals(mColumns)) {
                    TextView.setEnabled(true);
                    break;
                } else {
                    TextView.setEnabled(false);
                }
            }
        }
    }

这样 无论点击哪种属性值,单个点击,都可以实现 单个按钮全局刷新了,这一波 先说到这
大家看看思路

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值