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);
}
}
}
}
这样 无论点击哪种属性值,单个点击,都可以实现 单个按钮全局刷新了,这一波 先说到这
大家看看思路