1.概述
在商城类App中多属性商品的各规格联动选择的实现。
2.效果
商城类App中多属性商品规格选择的效果类型很多,本文实现的效果和淘宝相仿,效果如下:
3.思路
3.1规格属性联动
实现思路主要与后台接口的数据有关,本文的数据主要包括两个数组,商品的各规格属性的数组以及商品的规格属性组合的数组。此处题主在本地放了一个简单的json数据(可以去assets中修改数据,增加规格或者规格属性组合)。
如下:
{
"id": "1",
"price": "3400~3500",
"repertory": "22",
"img": "http://www.ucicq.com/uploads/allimg/170304/03150NL5_0.jpeg",
"specKey": [
{
"id": "1",
"spec_name": "颜色",
"spec_key": [
"白色",
"红色",
"金色"
]
},
{
"id": "2",
"spec_name": "霸气",
"spec_key": [
"见闻色",
"武装色",
"霸王色"
]
},
{
"id": "3",
"spec_name": "尺寸",
"spec_key": [
"钻地",
"爬行",
"飞行"
]
}
],
"specsGroup": [
{
"id": "1",
"price": "90.00",
"repertory": "25",
"goods_spec": [
"白色",
"见闻色",
"钻地"
],
"img": "http://img3.imgtn.bdimg.com/it/u=2247424153,1809959294&fm=11&gp=0.jpg"
},
{
"id": "2",
"price": "100.00",
"repertory": "4",
"goods_spec": [
"红色",
"见闻色",
"钻地"
],
"img": "http://www.005.tv/uploads/allimg/170208/1S92W191-19.jpg"
},
{
"id": "3",
"price": "200.00",
"repertory": "2",
"goods_spec": [
"红色",
"武装色",
"飞行"
],
"img": "http://imgsrc.baidu.com/forum/w=580/sign=92466e82763e6709be0045f70bc69fb8/71e24cd02f2eb938ae90e857dc628535e4dd6f98.jpg"
},
{
"id": "4",
"price": "300.00",
"repertory": "12",
"goods_spec": [
"红色",
"霸王色",
"飞行"
],
"img": "http://imgsrc.baidu.com/forum/w=580/sign=54bcb81c855494ee87220f111df4e0e1/768ca80f4bfbfbed0c060fdc71f0f736aec31fdc.jpg"
},
{
"id": "5",
"price": "400.00",
"repertory": "22",
"goods_spec": [
"金色",
"霸王色",
"爬行"
],
"img": "http://www.005.tv/uploads/allimg/170208/1S92S645-8.jpg"
},
{
"id": "6",
"price": "500.00",
"repertory": "22",
"goods_spec": [
"金色",
"霸王色",
"飞行"
],
"img": "http://zgsuixian.com/up/2017-2/201702051016251725888.jpg"
}
]
}
数据中该商品有3种规格,各规格下包含3种属性,各个规格属性组合应该为27种。但是在实际数据中,所给出的规格属性组合只有6种,说明还有21种规格属性组合的商品是没有的(此处暂不考虑库存)。所以在规格选择时,需要在UI上展现出来。本文思路是构建几个可供查找的数组,在每次选择时遍历查找,从而设置状态。
3.2规格中属性根据属性的字数 动态换行
此处用到了六六大侠 一篇博客中的jar包, 将jar包中的内容写成了代码中的三个类,其中自定义的控件customListView在listview中计算控件高度时仍存在问题,代码中使用的addView动态加载(之后会参考其中的逻辑,将此控件优化)。
4.实现代码
4.1项目结构
4.2xml布局此处只贴两处
4.2.1Dialog的布局 dialog_select_more
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rv_one"
android:layout_width="match_parent"
android:layout_height="80dp">
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@color/main_transparent" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@+id/view"
android:background="@color/main_color_white">
<TextView
android:id="@+id/tv_goods_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="93dp"
android:layout_marginTop="16dp"
android:text="¥438.00"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/ui_26_sp" />
<ImageView
android:id="@+id/iv_dismiss_dialog"