电商材质选择逻辑(不限材质数量)

这里写图片描述

逻辑分析

非java语言 只需要看下面几句

1.百度适用你的流式布局
2.下面的假设性原则

后台只是告诉我,可能多种材质具体又几种,不确定,这就意味着我得写出通用性的。
一开始我想的十分复杂。你每选择一个 再选择一个。都要去发生界面变化,还要去跟库存比较选中和可选不可选的问题。
每一次选择只能绝对其他行材质,不能决定和他同一类的。这样想就复杂了。千变万化。

  1. 我就开始思考什么是不变的,那就是库存,如下例,不管怎么变,总库存才5件不同的类型。
  2. 只要选中项符合这5件那么就可选 这样问题就明朗了
  3. 假设性原则
    我们没有选中为-1,初始化根据材质的数量-1_-1_-1_-1_-1_-1,假设 第一个材质的第一个被选中position【0,0】被选中 (此处要注意position和id是不一样的)
    我们就能得到如黑色对应的datas+position—>id是1, 那么现在选中项就是1_-1_-1_-1_-1_-1
    然后再选择一个【4,2】 继续这样的比较1_-1_-1_-1_3_-1保存下来

    我们就开始假设性原则,把每一个按钮假设选中进去替换-1 如果我们开始假设第二行某按钮1_XID_-1_-1_3_-1
    XID是你假设被选中的id 我们去和5个库存类型对比-1则视为相等。不为-1必须,至少有一个相等。相等则你假设的 选项就可以选
    如果没有一个相等 那么他就不符合 即当他被假设选中时候加上当前选中项,库存里面是没有的。那么他应该变为灰色 示例代码中
    我们是以#按钮#作为不可选状态

  4. 既然得到了数据源,那么界面的显示变化到android里面就简单了

场景模拟

为方便大家实际查看代码有效性,用javase模拟一个场景
这里写图片描述

//假设后台传回来的库存每个商品具体材质的id 用“_”连接了起来,这里就有5个商品了
//例如黑色大码加厚_纯棉_XX_XX 当然具体可能没有这么多材质。但为了写出通用的 不管他有多少材质 我们就做了个实验

texture_ids_list.add("3_1_1_4_3_6");// 添加材质对应的id集合
        texture_ids_list.add("1_1_1_1_2_6");
        texture_ids_list.add("3_2_1_4_1_6");
        texture_ids_list.add("4_1_3_2_2_6");
        texture_ids_list.add("3_1_1_4_1_4");

直接运行 不是android项目

接入android直接改写.PrintUI即可,然后main方法改为初始化数据。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class aaad {

    public static List<String> texture_ids_list = new ArrayList<>();
    public static List<DataListInfo> datass = new ArrayList<>();

    // 根据库存 动态根据用户点击 显示该材质是否可选 ,多种材质有库存牵制,选中变红 未选中 白色 不可选变灰色
    public static void main(String[] args) {

        // 假设库存中有的材质 为了试验可靠性 我们将材质分类设多一点,如 黑色_L_羊毛_品牌_男装_XX
        // 假设后台数据将材质id按3_1_1_4_5_6连接。此例子只提供逻辑到时候适配一下你们后台数据即可
        texture_ids_list.add("3_1_1_4_3_6");// 添加材质对应的id集合
        texture_ids_list.add("1_1_1_1_2_6");
        texture_ids_list.add("3_2_1_4_1_6");
        texture_ids_list.add("4_1_3_2_2_6");
        texture_ids_list.add("3_1_1_4_1_4");

        // 所有材质集合 每层材质可能数量不相同
        // 服务器传回来包括id的数据
        int[][] aaid = new int[][] { { 1, 2, 3, 4, 5 }, { 1, 2 }, { 1, 2, 3 },
                { 1, 2, 3, 4 }, { 1, 2, 3 }, { 1, 2, 3, 4, 5, 6 } };

        // 将带有id的数据和状态整合在一起。但实际操作中是服务器传回来的数据里面多加一个字段STATE 即可
        for (int i = 0; i < aaid.length; i++) {
            int[] item = aaid[i];
            List<Data> datas = new ArrayList<>();
            for (int j = 0; j < item.length; j++) {
                datas.add(new Data(item[j], null));
            }
            DataListInfo dataListInfo = new DataListInfo(datas);
            datass.add(dataListInfo);
        }

        // 根据库存 初始化 是否可选材质
        // FormatState(-1, -1);
        freshUI();
        // 将材质UI显示给用户 初始化 用户未选择
        PrintUI(datass);

        String str = null;
        Scanner sc = null;
        System.out
                .println("请模拟点击事件,选择材质d :(如1空格3(下标)-----》点击了第2行4列个材质)\n **缺货 []选中  其他为可选");
        while (true) {
            sc = new Scanner(System.in);
            str = sc.nextLine();

            if (str == null || str.length() != 3 || !str.contains(" "))
                System.out.println("输入格式错误,请重新输入");
            else {

                String[] split = str.split(" ");
                try {
                    int rowPosition = Integer.valueOf(split[0]).intValue();
                    int colPosition = Integer.valueOf(split[1]).intValue();

                    if (rowPosition + 1 > datass.size()
                            || colPosition + 1 > datass.get(rowPosition)
                                    .getDatas().size()) {
                        System.out.println("您选择了一块空区域,请重新输入");
                        continue;
                    }

                    List<Data> datas = datass.get(rowPosition).getDatas();
                    Data item = datas.get(colPosition);
                    if (item.currState == Data.CHOOSE_STATE.disabled) {
                        System.out.println(item.getIdPrintStr()
                                + "该材质已经为disabled不可选状态");
                    } else {
                        ClearChoosed(datas);
                        item.setCurrState(Data.CHOOSE_STATE.choose);
                        datass.get(rowPosition).setCurrSelectPosition(
                                colPosition);
                        // FormatState(rowPosition, colPosition);
                        freshUI();
                        //
                        PrintUI(datass);
                        System.out.println("选择成功,界面已经变化,请继续选择:");
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    if (e.toString().contains("NumberFormatException")) {
                        System.out.println("输入格式错误,您输入了非数字,请重新输入");
                    } else {
                        System.out.println("未知错误,请重新输入");
                    }

                }

            }
        }
    }

    /**
     * 根据当前选择+库存 进行不可选状态设定
     */
    private static void freshUI() {

        // 除了选中项状态重置
        for (int i = 0; i < datass.size(); i++) {
            for (int j = 0; j < datass.get(i).datas.size(); j++) {

                if (datass.get(i).datas.get(j).getCurrState() != Data.CHOOSE_STATE.choose) {
                    datass.get(i).datas.get(j).setCurrState(
                            Data.CHOOSE_STATE.disabled);
                }

            }
        }
        int[] selectArr = new int[datass.size()];
        for (int i = 0; i < datass.size(); i++) {
            selectArr[i] = datass.get(i).getCurrSelectPosition() == -1?-1:datass.get(i).getDatas().get(datass.get(i).getCurrSelectPosition()).getId();
        }
        for (int i = 0; i < datass.size(); i++) {
            for (int j = 0; j < datass.get(i).datas.size(); j++) {

                int[] selectArr2 = selectArr.clone();
                selectArr2[i] = datass.get(i).getDatas().get(j).getId();// 将所有选择项对应哪一项替换为自己
                boolean is = isArrAvailable(selectArr2);

                if (is
                        && datass.get(i).getDatas().get(j).getCurrState() == Data.CHOOSE_STATE.disabled) {
                    datass.get(i).getDatas().get(j)
                            .setCurrState(Data.CHOOSE_STATE.unchoose);
                } else if (datass.get(i).getDatas().get(j).getCurrState() == Data.CHOOSE_STATE.unchoose) {
                    datass.get(i).getDatas().get(j)
                            .setCurrState(Data.CHOOSE_STATE.disabled);
                }
            }
        }
        System.err.println("可用");
        for (int i = 0; i < texture_ids_list.size(); i++) {
            System.out.println("--->" + texture_ids_list.get(i));
        }

    }

    private static boolean isArrAvailable(int[] selectArr) {
        for (int i = 0; i < texture_ids_list.size(); i++) {
            String string = texture_ids_list.get(i);
            String[] texture_idsplit = null;
            if (string.contains("_")) {
                texture_idsplit = string.split("_");
            } else {
                texture_idsplit = new String[] { string };
            }
            boolean is = true;
            for (int j = 0; j < texture_idsplit.length; j++) {
                if (selectArr[j] != -1
                        && Integer.valueOf(texture_idsplit[j]).intValue() != selectArr[j]) {
                    is = false;
                    break;
                }
            }

            if (is) {
                // 只要完美符合一个材质即可
                return is;
            }

        }

        for (int i = 0; i < selectArr.length; i++) {
            System.out.print(selectArr[i] + ",");
        }
        System.out.println("不匹配");
        return false;
    }
    /**
     * 模拟根据状态显示界面
     */
    private static void PrintUI(List<DataListInfo> datass) {
        for (int i = 0; i < datass.size(); i++) {
            List<Data> datas = datass.get(i).getDatas();
            for (int j = 0; j < datas.size(); j++) {
                System.out.print(datas.get(j).getIdPrintStr() + "  ");
            }
            System.out.println();
        }
    }

    /**
     * 清除当前层材质的选中项
     */
    private static void ClearChoosed(List<Data> datas) {
        for (int j = 0; j < datas.size(); j++) {
            if (datas.get(j).getCurrState() == Data.CHOOSE_STATE.choose) {
                datas.get(j).setCurrState(Data.CHOOSE_STATE.unchoose);
            }
        }
    }

    public static class DataListInfo {
        private int currSelectPosition = -1;
        private List<Data> datas;

        @Override
        public String toString() {
            return "DataListInfo [currSelectPosition=" + currSelectPosition
                    + ", datas=" + datas + "]";
        }

        public DataListInfo() {
            super();
        }

        public DataListInfo(List<Data> datas) {
            super();
            this.datas = datas;
        }

        public DataListInfo(int currSelectPosition, List<Data> datas) {
            super();
            this.currSelectPosition = currSelectPosition;
            this.datas = datas;
        }

        public int getCurrSelectPosition() {
            return currSelectPosition;
        }

        public void setCurrSelectPosition(int currSelectPosition) {
            this.currSelectPosition = currSelectPosition;
        }

        public List<Data> getDatas() {
            return datas;
        }

        public void setDatas(List<Data> datas) {
            this.datas = datas;
        }

    }

    public static class Data {
        // 除了原有的数据
        private CHOOSE_STATE currState = CHOOSE_STATE.disabled;// 默认未选中
        private int id;

        @Override
        public String toString() {
            return "Data [currState=" + currState + ", id=" + id + "]";
        }

        // unchoose可选而没有选择的状态
        public static enum CHOOSE_STATE {
            choose, unchoose, disabled
        }

        public Data(int id, CHOOSE_STATE currState) {
            super();
            if (currState != null)
                this.currState = currState;
            this.id = id;
        }

        public String getIdPrintStr() {
            if (currState == CHOOSE_STATE.choose) {

                return "[" + id + "]";
            } else if (currState == CHOOSE_STATE.disabled) {

                return "*" + id + "*";
            } else {
                return " " + id + " ";
            }
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public CHOOSE_STATE getCurrState() {
            return currState;
        }

        public void setCurrState(CHOOSE_STATE currState) {
            this.currState = currState;
        }

    }

    // 已选id连接形式 1,-1,3,4,-1(-1为没有选择比较时候为空) 是否被库存所包含 若不包括则为不可选库存texture_id
    // 返回仍然有效的库存
    public static List<String> checkChoosePositionExistTexture_ids() {

        List<String> nextTextureIdList = new ArrayList<>();

        for (int i = 0; i < texture_ids_list.size(); i++) {
            boolean isContain = true;
            String texture_id = texture_ids_list.get(i);
            if (texture_id.contains("_")) {
                String[] split = texture_id.split("_");

                for (int j = 0; j < split.length; j++) {
                    int currId = Integer.valueOf(split[j]).intValue();
                    int currSelectPosition = datass.get(j)
                            .getCurrSelectPosition();// 注意下标不是id 不同材质id可能重复
                                                        // 但同一行position是唯一的
                    if (currSelectPosition == -1) {
                        continue;
                    } else {
                        // for datass
                        int currSelectId = datass.get(j).getDatas()
                                .get(currSelectPosition).getId();
                        if (currSelectId != currId) {
                            // 如果当前材质确实有选中且 选中对应到该条库存不相同
                            // 那么该条库存不适用于 已经选择的按钮
                            isContain = false;
                            break;
                        }
                    }

                }
            } else {

                if (datass.size() == 1
                        && datass.get(0).getDatas()
                                .get(datass.get(0).getCurrSelectPosition())
                                .getId() == Integer.valueOf(texture_id)) {
                    isContain = true;
                } else {
                    isContain = false;
                    System.out
                            .println("checkChoosePositionExistTexture_ids数据出错!");
                }
            }
            if (isContain)
                nextTextureIdList.add(texture_id);

        }
        System.out.println("仍然可选:nextTextureIdList:"
                + nextTextureIdList.toString());

        return nextTextureIdList;

    }
}

android实际使用代码

  • 调用部分
textureSelectUtils = new TextureSelectUtils();

                    textureSelectUtils.initData(new TextureSelectUtils.PrintUIImpl() {
                        @Override
                        public void reFreshChooseUI(List<TextureSelectUtils.DataListInfo> datass) {

                            for (int i = 0; i < tables.size(); i++) {
                                CustomFlowTables tb = tables.get(i);
                                for (int j = 0; j < tb.getChildCount(); j++) {
                                    View view = tb.getChildAt(j);
                                    //这是我的自定义view会根据setEnabled+setSelected显示效果、
                                    //根据屏幕宽度流布局 有兴趣的可以联系我
                                    TextureSelectUtils.Data.CHOOSE_STATE state = datass.get(i).getDatas().get(j).getCurrState();
                                    if (state == TextureSelectUtils.Data.CHOOSE_STATE.disabled) {
                                        view.setEnabled(false);
                                    } else {
                                        view.setEnabled(true);
                                        if (state == TextureSelectUtils.Data.CHOOSE_STATE.choose) {
                                            view.setSelected(true);
                                        } else {
                                            view.setSelected(false);
                                        }
                                    }


//
                                }
                            }

                            updataProductInf(datass);//继续更新其他部分 如价格  或者已选择的名字
                            //通过getCurrSelectName()拼接
                        }
                    }, data.getData());
  • 工具类部分
package com.wcl.module.rex.utils.TextureSelect;

/**
 * Created by  Rex on 2017/5/2.
 */

import com.wcl.entity.response.RespProductTexture;

import java.util.ArrayList;
import java.util.List;


public class TextureSelectUtils {


    public interface PrintUIImpl {
        void reFreshChooseUI(List<DataListInfo> datass);

    }

    private List<String> texture_ids_list = new ArrayList<>();
    private List<DataListInfo> datass = new ArrayList<>();
    private PrintUIImpl Impl;

    public void initData(PrintUIImpl Impl, RespProductTexture.DataBean textureDatas) {
        if (textureDatas == null) {
            return;
        }
        this.Impl = Impl;
        List<RespProductTexture.DataBean.TextureBean> texture = textureDatas.getTexture();//库存
        // 添加材质对应的id集合
        for (int i = 0; i < texture.size(); i++) {
            texture_ids_list.add(texture.get(i).getTexture_ids());
        }
        List<RespProductTexture.DataBean.ListBean> textureDatasList = textureDatas.getList();//所有选项

        for (int i = 0; i < textureDatasList.size(); i++) {
            List<RespProductTexture.DataBean.ListBean.ListBean2> list2 = textureDatasList.get(i).getList();
            List<Data> datas = new ArrayList<>();
            for (int j = 0; j < list2.size(); j++) {
                datas.add(new Data(list2.get(j).getId(), null,list2.get(j).getGname()));
            }
            DataListInfo dataListInfo = new DataListInfo(datas);
            datass.add(dataListInfo);
        }
        initUI();
        // 所有材质集合 每层材质可能数量不相同
        // 服务器传回来包括id的数据
    }

    // 根据库存 动态根据用户点击 显示该材质是否可选 ,多种材质有库存牵制,选中变红 未选中 白色 不可选变灰色
    public void initUI() {
        freshUIData();
        // 将材质UI显示给用户 初始化 用户未选择
        PrintUI(datass);
    }

    public void onClick(int textureI, int textureJ) {

        List<Data> datas = datass.get(textureI).getDatas();
        Data item = datas.get(textureJ);
        if (item.currState == Data.CHOOSE_STATE.disabled) {
            System.out.println(item.getIdPrintStr()
                    + "该材质已经为disabled不可选状态");
        } else {
            ClearChoosed(datas);
            item.setCurrState(Data.CHOOSE_STATE.choose);
            datass.get(textureI).setCurrSelectPosition(
                    textureJ);
            // FormatState(rowPosition, colPosition);
            freshUIData();
            //
            PrintUI(datass);
            System.out.println("选择成功,界面已经变化,请继续选择:");
        }
    }

    /**
     * 根据当前选择+库存 进行不可选状态设定
     */
    private void freshUIData() {

        // 除了选中项状态重置
        for (int i = 0; i < datass.size(); i++) {
            for (int j = 0; j < datass.get(i).datas.size(); j++) {

                if (datass.get(i).datas.get(j).getCurrState() != Data.CHOOSE_STATE.choose) {
                    datass.get(i).datas.get(j).setCurrState(
                            Data.CHOOSE_STATE.disabled);
                }

            }
        }
        int[] selectArr = new int[datass.size()];
        for (int i = 0; i < datass.size(); i++) {
            selectArr[i] = datass.get(i).getCurrSelectPosition() == -1 ? -1 : datass.get(i).getDatas().get(datass.get(i).getCurrSelectPosition()).getId();
        }
        for (int i = 0; i < datass.size(); i++) {
            for (int j = 0; j < datass.get(i).datas.size(); j++) {

                int[] selectArr2 = selectArr.clone();
                selectArr2[i] = datass.get(i).getDatas().get(j).getId();// 将所有选择项对应哪一项替换为自己
                boolean is = isArrAvailable(selectArr2);


                if (is && datass.get(i).getDatas().get(j).getCurrState() == Data.CHOOSE_STATE.disabled) {
                    datass.get(i).getDatas().get(j)
                            .setCurrState(Data.CHOOSE_STATE.unchoose);
                } else if (datass.get(i).getDatas().get(j).getCurrState() == Data.CHOOSE_STATE.unchoose) {
                    datass.get(i).getDatas().get(j)
                            .setCurrState(Data.CHOOSE_STATE.disabled);
                }
            }
        }
        for (int i = 0; i < texture_ids_list.size(); i++) {
            System.out.println("--->" + texture_ids_list.get(i));
        }

    }

    private boolean isArrAvailable(int[] selectArr) {
        for (int i = 0; i < texture_ids_list.size(); i++) {
            String string = texture_ids_list.get(i);
            String[] texture_idsplit = null;
            if (string.contains("_")) {
                texture_idsplit = string.split("_");
            } else {
                texture_idsplit = new String[]{string};
            }
            boolean is = true;
            for (int j = 0; j < texture_idsplit.length; j++) {
                if (selectArr[j] != -1
                        && Integer.valueOf(texture_idsplit[j]).intValue() != selectArr[j]) {
                    is = false;
                    break;
                }
            }

            if (is) {
                // 只要完美符合一个材质即可
                return is;
            }

        }

        for (int i = 0; i < selectArr.length; i++) {
            System.out.print(selectArr[i] + ",");
        }
        System.out.println("不匹配");
        return false;
    }

    /**
     * 模拟根据状态显示界面
     */
    private void PrintUI(List<DataListInfo> datass) {
        if (Impl != null) {
            Impl.reFreshChooseUI(datass);
        }

        for (int i = 0; i < datass.size(); i++) {
            for (int j = 0; j < datass.get(i).getDatas().size(); j++) {
               System.out.print(datass.get(i).getDatas().get(j).getIdPrintStr());
            }
            System.out.println();
        }
    }

    /**
     * 清除当前层材质的选中项
     */
    private void ClearChoosed(List<Data> datas) {
        for (int j = 0; j < datas.size(); j++) {
            if (datas.get(j).getCurrState() == Data.CHOOSE_STATE.choose) {
                datas.get(j).setCurrState(Data.CHOOSE_STATE.unchoose);
            }
        }
    }

    public static class DataListInfo {
        private int currSelectPosition = -1;
        private String currSelectName = "";
        private List<Data> datas;

        @Override
        public String toString() {
            return "DataListInfo [currSelectPosition=" + currSelectPosition
                    + ", datas=" + datas + "]";
        }

        public String getCurrSelectName() {
            if (currSelectPosition == -1 || datas == null || datas.size() == 0)
                return "";
            else
                return datas.get(currSelectPosition).getName();

        }

        public void setCurrSelectName(String currSelectName) {
            this.currSelectName = currSelectName;
        }

        public DataListInfo() {
            super();
        }

        public DataListInfo(List<Data> datas) {
            super();
            this.datas = datas;
        }

        public DataListInfo(int currSelectPosition, List<Data> datas) {
            super();
            this.currSelectPosition = currSelectPosition;
            this.datas = datas;
        }

        public int getCurrSelectPosition() {
            return currSelectPosition;
        }

        public void setCurrSelectPosition(int currSelectPosition) {
            this.currSelectPosition = currSelectPosition;
        }

        public List<Data> getDatas() {
            return datas;
        }

        public void setDatas(List<Data> datas) {
            this.datas = datas;
        }

    }

    public static class Data {
        // 除了原有的数据
        private CHOOSE_STATE currState = CHOOSE_STATE.disabled;// 默认未选中
        private int id;
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Data [currState=" + currState + ", id=" + id + "]";
        }

        // unchoose可选而没有选择的状态
        public  enum CHOOSE_STATE {
            choose, unchoose, disabled
        }

        public Data(int id, CHOOSE_STATE currState, String name) {
            super();
            if (currState != null)
                this.currState = currState;
            this.id = id;
            this.name = name;
        }

        public String getIdPrintStr() {
            if (currState == CHOOSE_STATE.choose) {

                return "[" + id + "]";
            } else if (currState == CHOOSE_STATE.disabled) {

                return "*" + id + "*";
            } else {
                return " " + id + " ";
            }
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public CHOOSE_STATE getCurrState() {
            return currState;
        }

        public void setCurrState(CHOOSE_STATE currState) {
            this.currState = currState;
        }

    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值