逻辑分析
非java语言 只需要看下面几句
1.百度适用你的流式布局
2.下面的假设性原则
后台只是告诉我,可能多种材质具体又几种,不确定,这就意味着我得写出通用性的。
一开始我想的十分复杂。你每选择一个 再选择一个。都要去发生界面变化,还要去跟库存比较选中和可选不可选的问题。
每一次选择只能绝对其他行材质,不能决定和他同一类的。这样想就复杂了。千变万化。
- 我就开始思考什么是不变的,那就是库存,如下例,不管怎么变,总库存才5件不同的类型。
- 只要选中项符合这5件那么就可选 这样问题就明朗了
假设性原则
我们没有选中为-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必须,至少有一个相等。相等则你假设的 选项就可以选
如果没有一个相等 那么他就不符合 即当他被假设选中时候加上当前选中项,库存里面是没有的。那么他应该变为灰色 示例代码中
我们是以#按钮#作为不可选状态- 既然得到了数据源,那么界面的显示变化到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;
}
}
}