Android 购物选择颜色、尺码实现(二)
Android 购物选择颜色(尺码)实现(一)这篇文章只是简单的介绍以及实现了点击效果还没有实现颜色、尺码、库存等联动所以在闲暇时间就写了这篇文章实现这样的效果。首先还是上几张淘宝的效果图在选择尺码或者颜色分类的时候颜色分类、尺码、库存以及图片都会有相应变化。接下来我们 就看看如何实现这样的效果。先看看我实现的效果图一.分析要实现这样的效果商品属性就得有尺码、颜色、库存等我们简称为sku当你选择某一个尺码的时候先查找该颜色对应的尺码列表是什么接着用这个尺码列表和总的尺码列表进行对比要是有尺码不在总尺码列表中那么就标记改尺码是不可选的颜色也同理。只要你明白这道理那么就很好理解了。下来我们看看具体的代码实现。二.实现1.新建项目2.打开布局文件activity_main.xml该布局文件是主界面布局代码就不罗列了具体代码见代码下载。3.在layou文件夹中新建布局gridview_item.xml文件该布局文件主要是设置GridView的item布局主要是一个TextView显示商品属性PS: 这一块要是不了解的话可以先看看这篇文章Android 购物选择颜色(尺码)实现(一)4.新建MyGridView类继承GridView解决滑动冲突/** * 滑动冲突 */ public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() MotionEvent.ACTION_MOVE) { return true; } return super.dispatchTouchEvent(ev); } }5.新建SkuAdapter 继承BaseAdapter其中用到的接口回调public class SkuAdapter extends BaseAdapter { private ListBean list;//数据源 private LayoutInflater mInflater;// 得到一个LayoutInfalter对象用来导入布局 public onItemClickListener itemClickListener;// 接口回调 public void setItemClickListener(onItemClickListener itemClickListener) { this.itemClickListener itemClickListener; } public SkuAdapter(ListBean list, Context context) { super(); this.mInflater LayoutInflater.from(context); this.list list; } Override public int getCount() { // TODO Auto-generated method stub return list.size(); } Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder; if (convertView null) { holder new ViewHolder(); convertView mInflater.inflate(R.layout.gridview_item, null); /** 得到各个控件的对象 */ holder.title (TextView) convertView.findViewById(R.id.ItemText); holder.layout (LinearLayout) convertView.findViewById(R.id.layout); convertView.setTag(holder);// 绑定ViewHolder对象 } else { holder (ViewHolder) convertView.getTag();// 取出ViewHolder对象 } final Bean bean list.get(position); switch (bean.getStates()) { // 选中 case 0: holder.layout.setBackgroundResource(R.xml.shape2); holder.title.setTextColor(Color.WHITE); break; // 未选中 case 1: holder.layout.setBackgroundResource(R.xml.shape1); holder.title.setTextColor(Color.BLACK); break; // 不可选 case 2: holder.layout.setBackgroundResource(R.xml.shape1); holder.title.setTextColor(Color.parseColor(#999999)); break; default: break; } /** 设置TextView显示的内容即我们存放在动态数组中的数据 */ holder.title.setText(bean.getName()); holder.layout.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { // TODO Auto-generated method stub if (itemClickListener ! null) { if(!bean.getStates().equals(2)){ itemClickListener.onItemClick(bean, position); } } } }); return convertView; } public final class ViewHolder { public TextView title; public LinearLayout layout; } public interface onItemClickListener { public void onItemClick(Bean bean, int position); } }6.新建Constants 类当然你也可以自己在Activity中定义常量public class Constants { //颜色数组 public static final String[] colorArr{铁蓝灰,孔雀蓝,深蓝,中国红,艳紫}; //尺码数组 public static final String[] sizeArr{S,M,L,XL,XXL,XXXL}; }7.新建DataUtil用来数据处理代码太长就不讲解了具体的代码请下载代码后查看8.最主要的类MainActivity该类包含了所有的实现代码如下public class MainActivity extends Activity { ListSkuItme mList;// sku数据 ListBean mColorList;// 颜色列表 ListBean mSizeList;// 尺码列表 GridView gvColor;// 颜色 GridView gvSize;// 尺码 SkuAdapter skuColorAdapter;// 颜色适配器 SkuAdapter skuSizeAdapter;// 尺码适配器 String color;// String size;// TextView tvSkuName;// 显示sku TextView tvSkuStock;// 显示库存 int stock 0;// 库存 Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gvSize (GridView) findViewById(R.id.gv_size); gvColor (GridView) findViewById(R.id.gv_color); tvSkuName (TextView) findViewById(R.id.tv_sku); tvSkuStock (TextView) findViewById(R.id.tv_sku_stock); addData(); stock DataUtil.getAllStock(mList); if (stock 0) { tvSkuStock.setText(库存 stock ); } skuColorAdapter new SkuAdapter(mColorList, this); gvColor.setAdapter(skuColorAdapter); skuColorAdapter.setItemClickListener(new onItemClickListener() { Override public void onItemClick(Bean bean, int position) { // TODO Auto-generated method stub color bean.getName(); switch (bean.getStates()) { case 0: // 清空尺码 mSizeListDataUtil.clearAdapterStates(mSizeList); skuSizeAdapter.notifyDataSetChanged(); // 清空颜色 mColorListDataUtil.clearAdapterStates(mColorList); skuColorAdapter.notifyDataSetChanged(); color ; // 判断使用选中了尺码 if (!TextUtils.isEmpty(size)) { // 选中尺码计算库存 stock DataUtil.getSizeAllStock(mList,size); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码); // 获取该尺码对应的颜色列表 ListString list DataUtil.getColorListBySize(mList,size); if (list ! null list.size() 0) { // 更新颜色列表 mColorList DataUtil.setSizeOrColorListStates(mColorList,list, color); skuColorAdapter.notifyDataSetChanged(); } mSizeListDataUtil.setAdapterStates(mSizeList,size); skuSizeAdapter.notifyDataSetChanged(); } else { // 所有库存 stock DataUtil.getAllStock(mList); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码,颜色分类); } break; case 1: // 选中颜色 mColorListDataUtil.updateAdapterStates(mColorList,0, position); skuColorAdapter.notifyDataSetChanged(); // 计算改颜色对应的尺码列表 ListString list DataUtil.getSizeListByColor(mList,color); if (!TextUtils.isEmpty(size)) { // 计算改颜色与尺码对应的库存 stock DataUtil.getStockByColorAndSize(mList,color, size); tvSkuName.setText(规格: color size); if (stock 0) { tvSkuStock.setText(库存 stock ); } if (list ! null list.size() 0) { // 更新尺码列表 mSizeList DataUtil.setSizeOrColorListStates(mSizeList,list, size); skuSizeAdapter.notifyDataSetChanged(); } } else { // 根据颜色计算库存 stock DataUtil.getColorAllStock(mList,color); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码); if (list ! null list.size() 0) { // 更新尺码列表 mSizeList DataUtil.setSizeOrColorListStates(mSizeList,list, ); skuSizeAdapter.notifyDataSetChanged(); } } break; default: break; } } }); skuSizeAdapter new SkuAdapter(mSizeList, this); gvSize.setAdapter(skuSizeAdapter); skuSizeAdapter.setItemClickListener(new onItemClickListener() { Override public void onItemClick(Bean bean, int position) { // TODO Auto-generated method stub size bean.getName(); switch (bean.getStates()) { case 0: // 清空尺码 mSizeListDataUtil.clearAdapterStates(mSizeList); skuSizeAdapter.notifyDataSetChanged(); // 清空颜色 mColorListDataUtil.clearAdapterStates(mColorList); skuColorAdapter.notifyDataSetChanged(); size ; if (!TextUtils.isEmpty(color)) { // 计算改颜色对应的所有库存 stock DataUtil.getColorAllStock(mList,color); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码); // 计算改颜色对应的尺码列表 ListString list DataUtil.getSizeListByColor(mList,color); if (list ! null list.size() 0) { // 更新尺码列表 mSizeList DataUtil.setSizeOrColorListStates(mSizeList,list, size); skuSizeAdapter.notifyDataSetChanged(); } mColorListDataUtil.setAdapterStates(mColorList,color); skuColorAdapter.notifyDataSetChanged(); } else { // 获取所有库存 stock DataUtil.getAllStock(mList); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码,颜色分类); } break; case 1: // 选中尺码 mSizeListDataUtil.updateAdapterStates(mSizeList, 0, position); skuSizeAdapter.notifyDataSetChanged(); // 获取该尺码对应的颜色列表 ListString list DataUtil.getColorListBySize(mList,size); if (!TextUtils.isEmpty(color)) { // 计算改颜色与尺码对应的库存 stock DataUtil.getStockByColorAndSize(mList,color, size); tvSkuName.setText(规格: color size); if (stock 0) { tvSkuStock.setText(库存 stock ); } if (list ! null list.size() 0) { // 更新颜色列表 mColorList DataUtil.setSizeOrColorListStates(mColorList,list, color); skuColorAdapter.notifyDataSetChanged(); } } else { // 计算改尺码的所有库存 stock DataUtil.getSizeAllStock(mList,size); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择颜色分类); if (list ! null list.size() 0) { mColorList DataUtil.setSizeOrColorListStates(mColorList,list, ); skuColorAdapter.notifyDataSetChanged(); } } break; default: break; } } }); } /** * 模拟数据 */ private void addData() { mList new ArrayListSkuItme(); mColorList new ArrayListBean(); mSizeList new ArrayListBean(); String[] colorArr Constants.colorArr; String[] sizeArr Constants.sizeArr; int color colorArr.length; int size sizeArr.length; for (int i 0; i color; i) { Bean bean new Bean(); bean.setName(colorArr[i]); bean.setStates(1); mColorList.add(bean); } for (int i 0; i size; i) { Bean bean new Bean(); bean.setName(sizeArr[i]); bean.setStates(1); mSizeList.add(bean); } String color0 colorArr[0]; String size0 sizeArr[0]; String color1 colorArr[1]; String size1 sizeArr[1]; String color2 colorArr[2]; String size2 sizeArr[2]; String color3 colorArr[3]; String size3 sizeArr[3]; String color4 colorArr[4]; String size4 sizeArr[4]; String size5 sizeArr[5]; SkuItme item0 new SkuItme(); item0.setId(1); item0.setSkuColor(color0); item0.setSkuSize(size0); item0.setSkuStock(10); mList.add(item0); SkuItme item1 new SkuItme(); item1.setId(2); item1.setSkuColor(color0); item1.setSkuSize(size1); item1.setSkuStock(1); mList.add(item1); SkuItme item2 new SkuItme(); item2.setId(3); item2.setSkuColor(color1); item2.setSkuSize(size0); item2.setSkuStock(12); mList.add(item2); SkuItme item3 new SkuItme(); item3.setId(4); item3.setSkuColor(color1); item3.setSkuSize(size2); item3.setSkuStock(123); mList.add(item3); SkuItme item4 new SkuItme(); item4.setId(5); item4.setSkuColor(color1); item4.setSkuSize(size1); item4.setSkuStock(53); mList.add(item4); SkuItme item5 new SkuItme(); item5.setId(6); item5.setSkuColor(color2); item5.setSkuSize(size1); item5.setSkuStock(13); mList.add(item5); SkuItme item6 new SkuItme(); item6.setId(7); item6.setSkuColor(color0); item6.setSkuSize(size3); item6.setSkuStock(18); mList.add(item6); SkuItme item7 new SkuItme(); item7.setId(8); item7.setSkuColor(color2); item7.setSkuSize(size3); item7.setSkuStock(14); mList.add(item7); SkuItme item8 new SkuItme(); item8.setId(9); item8.setSkuColor(color1); item8.setSkuSize(size3); item8.setSkuStock(22); mList.add(item8); SkuItme item9 new SkuItme(); item9.setId(10); item9.setSkuColor(color0); item9.setSkuSize(size4); item9.setSkuStock(29); mList.add(item9); SkuItme item10 new SkuItme(); item10.setId(11); item10.setSkuColor(color2); item10.setSkuSize(size5); item10.setSkuStock(64); mList.add(item10); SkuItme item11 new SkuItme(); item11.setId(12); item11.setSkuColor(color3); item11.setSkuSize(size2); item11.setSkuStock(70); mList.add(item11); SkuItme item12 new SkuItme(); item12.setId(13); item12.setSkuColor(color4); item12.setSkuSize(size0); item12.setSkuStock(80); mList.add(item12); SkuItme item13 new SkuItme(); item13.setId(14); item13.setSkuColor(color3); item13.setSkuSize(size4); item13.setSkuStock(35); mList.add(item13); SkuItme item14 new SkuItme(); item14.setId(15); item14.setSkuColor(color4); item14.setSkuSize(size1); item14.setSkuStock(62); mList.add(item14); SkuItme item15 new SkuItme(); item15.setId(16); item15.setSkuColor(color3); item15.setSkuSize(size5); item15.setSkuStock(41); mList.add(item15); SkuItme item16 new SkuItme(); item16.setId(17); item16.setSkuColor(color1); item16.setSkuSize(size5); item16.setSkuStock(39); mList.add(item16); SkuItme item17 new SkuItme(); item17.setId(18); item17.setSkuColor(color4); item17.setSkuSize(size5); item17.setSkuStock(37); mList.add(item17); SkuItme item18 new SkuItme(); item18.setId(19); item18.setSkuColor(color4); item18.setSkuSize(size2); item18.setSkuStock(44); mList.add(item18); SkuItme item19 new SkuItme(); item19.setId(20); item19.setSkuColor(color4); item19.setSkuSize(size3); item19.setSkuStock(61); mList.add(item19); } }这样我们就基本可以实现类似淘宝选择颜色尺码的效果了。效果看着还不错O(∩_∩)O~三.我的项目分析说明1. 首先来张项目结构图(1).Bean类是适配器的数据实体它的属性有private String name;//名称 private String states;//状态 3种 1 选中 2 未选中 3不可选name即具体的尺码或者颜色states是用来标识目前状态是什么。(2).Constants 常量类保存了数据源//颜色数组 public static final String[] colorArr{铁蓝灰,孔雀蓝,深蓝,中国红,艳紫}; //尺码数组 public static final String[] sizeArr{S,M,L,XL,XXL,XXXL};(3).SkuItme sku的数据实体类private String id;//id private String skuSize;//尺码 private String skuColor;//颜色 private int skuStock;//库存 private String skuIamgeUrl;//图片路径(4).MyGridView 解决GridView和ScrollView滑动冲突(5).SkuAdapter 适配器显示尺码或者颜色分类(6).DataUtil 数据处理类相信大家看完这篇文章就或许有思路实现类似淘宝的选择颜色、尺码效果了本人水平有限有错误的地方欢迎大家指出PS代码下载

相关新闻

java web接口开发(一) 环境搭建和新建项目

java web接口开发(一) 环境搭建和新建项目

一直都在做App开发,但是对java web方面的了解比较少,最近有时间,所以自己就寻思动手从零开始搭建一个java web项目。该项目主要是给app,提供接口服务,简称项目为‘mserver’。好了,接下来,我们就…

2026/8/11 1:19:38 阅读更多 →
Spring Boot+Redis限流方案实战:应对高并发流量洪峰

Spring Boot+Redis限流方案实战:应对高并发流量洪峰

1. 项目概述:当接口遭遇流量洪峰时上周五凌晨三点,我被一阵急促的报警短信惊醒——核心支付接口的QPS突然从200飙升到8000。登录监控系统一看,整个服务集群已经全线飘红,罪魁祸首是某个合作方脚本失控导致的异常调用。这种场景在分…

2026/8/11 1:19:38 阅读更多 →
java web接口开发(二) 接口开发具体实现

java web接口开发(二) 接口开发具体实现

java web接口开发(一) 环境搭建和新建项目讲解了如何搭建一个简单的Java Web接口项目,如果你还没了解,建议先浏览下!今天这篇文章主要讲解的就是接口开发,打算使用比较古老的或者说比较原始方法实现的接口。 一.数据库设计。 假设要做一个简单的学生信息管理系统,数据库名…

2026/8/11 1:19:38 阅读更多 →

最新新闻

Hermes 与 ReAct 模式对比分析_1

Hermes 与 ReAct 模式对比分析_1

Hermes 与 ReAct 模式对比分析 结论先行 Hermes 不完全是经典 ReAct 模式,而是一个基于 Function Calling 的 Tool-Use Loop,但它和 ReAct 有深层对应关系。一、经典 ReAct 模式 ReAct 的核心是 文本驱动的三段式循环: Thought: 我需要查找北…

2026/8/11 2:25:02 阅读更多 →
单步追踪-条件断点的设置

单步追踪-条件断点的设置

目录 第一步:生成exe循环文件 第二步:打开 x32dbg 第三步:找到你的 main 函数 第四步:找到你的 for 循环 第五步:设置条件断点 第六步:运行程序,观察条件断点 第一步:生成exe循…

2026/8/11 2:25:02 阅读更多 →
手术室织物加温柜(恒温箱):原理、应用与选型指南

手术室织物加温柜(恒温箱):原理、应用与选型指南

一、引言:手术室织物加温的重要性在手术室环境中,维持患者体温是保障手术安全、降低并发症风险的关键环节。手术中使用的各类织物,如手术单、手术衣、敷料等,若温度过低,直接接触患者皮肤会导致热量散失,可…

2026/8/11 2:25:02 阅读更多 →
如何快速获取macOS安装包:终极图形化下载工具指南

如何快速获取macOS安装包:终极图形化下载工具指南

如何快速获取macOS安装包:终极图形化下载工具指南 【免费下载链接】DownloadFullInstaller macOS application written in SwiftUI that downloads installer pkgs for the Install macOS Big Sur application. 项目地址: https://gitcode.com/gh_mirrors/do/Down…

2026/8/11 2:25:02 阅读更多 →
中国科技大学揭秘:“已过时“的搜索算法竟然打败了所有AI新贵?

中国科技大学揭秘:“已过时“的搜索算法竟然打败了所有AI新贵?

这项由中国科学技术大学、北京元石科技和北京市农林科学院信息技术研究中心联合开展的研究,以预印本形式发布于2026年7月,论文编号为arXiv:2607.26497,有兴趣深入了解的读者可通过该编号查询完整论文。**一个你可能没想过的问题**假设你是一家…

2026/8/11 2:25:02 阅读更多 →
Bash Shell兼容模式详解与跨版本脚本实践

Bash Shell兼容模式详解与跨版本脚本实践

1. Shell兼容模式的前世今生作为Bash shell最容易被忽视却至关重要的功能之一,兼容模式(Compatibility Mode)的诞生源于Unix/Linux世界中各种shell的版本碎片化问题。我在处理跨平台脚本时,曾遇到一个经典案例:某金融公司的清算脚本在CentOS …

2026/8/11 2:24:02 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →