电商项目中常常有购物车这个功能,做个很多项目了,都有不同的界面,选了一个来讲一下。

RecyclerView 模仿淘宝购物车功能(删除选择商品,商品计算,选择, 全选反选,商品数量加减等)

看看效果图:

Activity代码:

/*****
* RecyclerView 模仿淘宝购物车功能
*
* 删除选择商品,商品计算,选择,全选反选,商品数量加减等
*
*/
public class MainActivity extends AppCompatActivity { private RecyclerView rvNestDemo;
private CartAdapter cartAdapter;
CartInfo cartInfo;
double price;
int num; TextView cartNum;
TextView cartMoney;
Button cartShoppMoular;
CheckBox checkBox; private TextView btnDelete; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rvNestDemo = (RecyclerView) findViewById(R.id.rv_nest_demo);
cartNum = findViewById(R.id.cart_num);
cartMoney = findViewById(R.id.cart_money);
cartShoppMoular = findViewById(R.id.cart_shopp_moular);
cartShoppMoular.setOnClickListener(new OnClickListener());
checkBox = findViewById(R.id.cbx_quanx_check);
checkBox.setOnClickListener(new OnClickListener());
btnDelete = (TextView) findViewById(R.id.btn_delete);
initView();
} private void initView() {
btnDelete.setOnClickListener(new OnClickListener());
showData();
rvNestDemo.setLayoutManager(new LinearLayoutManager(this));
DividerItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
itemDecoration.setDrawable(ContextCompat.getDrawable(this, R.drawable.line_divider_inset));
rvNestDemo.addItemDecoration(itemDecoration);
cartAdapter = new CartAdapter(this, cartInfo.getData());
rvNestDemo.setAdapter(cartAdapter);
showExpandData(); } private void showExpandData() {
/**
* 全选
*/
cartAdapter.setOnItemClickListener(new OnViewItemClickListener() {
@Override
public void onItemClick(boolean isFlang, View view, int position) {
cartInfo.getData().get(position).setIscheck(isFlang);
int length = cartInfo.getData().get(position).getItems().size();
for (int i = 0; i < length; i++) {
cartInfo.getData().get(position).getItems().get(i).setIscheck(isFlang);
}
cartAdapter.notifyDataSetChanged();
showCommodityCalculation();
}
}); /**
* 计算价钱
*/
cartAdapter.setOnItemMoneyClickListener(new OnItemMoneyClickListener() {
@Override
public void onItemClick(View view, int position) {
showCommodityCalculation();
} });
} /***
* 计算商品的数量和价格
*/
private void showCommodityCalculation() {
price = 0;
num = 0;
for (int i = 0; i < cartInfo.getData().size(); i++) {
for (int j = 0; j < cartInfo.getData().get(i).getItems().size(); j++) {
if (cartInfo.getData().get(i).getItems().get(j).ischeck()) {
price += Double.valueOf((cartInfo.getData().get(i).getItems().get(j).getNum() * Double.valueOf(cartInfo.getData().get(i).getItems().get(j).getPrice())));
num++;
} else {
checkBox.setChecked(false);
}
}
}
if (price == 0.0) {
cartNum.setText("共0件商品");
cartMoney.setText("¥ 0.0");
return;
}
try {
String money = String.valueOf(price);
cartNum.setText("共" + num + "件商品");
if (money.substring(money.indexOf("."), money.length()).length() > 2) {
cartMoney.setText("¥ " + money.substring(0, (money.indexOf(".") + 3)));
return;
}
cartMoney.setText("¥ " + money.substring(0, (money.indexOf(".") + 2)));
} catch (Exception e) {
e.printStackTrace();
}
} private void showData() {
cartInfo = JSON.parseObject(JSONDATA(), CartInfo.class);
} private class OnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) { //全选和不全选
case R.id.cbx_quanx_check:
if (checkBox.isChecked()) {
int length = cartInfo.getData().size();
for (int i = 0; i < length; i++) {
cartInfo.getData().get(i).setIscheck(true);
int lengthn = cartInfo.getData().get(i).getItems().size();
for (int j = 0; j < lengthn; j++) {
cartInfo.getData().get(i).getItems().get(j).setIscheck(true);
}
} } else {
int length = cartInfo.getData().size();
for (int i = 0; i < length; i++) {
cartInfo.getData().get(i).setIscheck(false);
int lengthn = cartInfo.getData().get(i).getItems().size();
for (int j = 0; j < lengthn; j++) {
cartInfo.getData().get(i).getItems().get(j).setIscheck(false);
}
}
}
cartAdapter.notifyDataSetChanged();
showCommodityCalculation();
break;
case R.id.btn_delete:
//删除选中商品
cartAdapter.removeChecked();
showCommodityCalculation();
break;
case R.id.cart_shopp_moular:
Toast.makeText(MainActivity.this,"提交订单: "+cartMoney.getText().toString()+"元",Toast.LENGTH_LONG).show();
break;
}
}
}

这是我写的第二个购物车,基本的功能都有了的。

有需要的小伙们,可以参考一下。

代码下载:https://github.com/DickyQie/android-shoppingcart/tree/tb-cart/

android ------ RecyclerView 模仿淘宝购物车的更多相关文章

  1. 仿淘宝购物车demo---增加和减少商品数量

    在上一篇博客中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了 ...

  2. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  3. 淘宝购物车页面 PC端和移动端实战

    最近花了半个月的时间,做了一个淘宝购物车页面的Demo.当然,为了能够更加深入的学习,不仅仅有PC端的固定宽度的布局,还实现了移动端在Media Query为768px以下(也就是实现了ipad,ip ...

  4. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  5. jQuery实现淘宝购物车小组件

    我爱撸码,撸码使我感到快乐! 大家好,我是Counter,本章将实现淘宝购物车小组件, 用原生js可以实现吗,当然可以,可是就是任性一回,就是想用jQuery 来实现下.HTML代码不多才4行,CSS ...

  6. vue实现淘宝购物车功能

    淘宝购物车功能,效果如下图 非常简单的逻辑,没有做代码的封装,代码如下 <div class="list-container"> <div class=" ...

  7. 漂亮!Javascript代码模仿淘宝宝贝搜索结果的分页显示效果

    分页按钮思想: 1.少于9页,全部显示 2.大于9页,1.2页显示,中间页码当前页为中心,前后各留两个页码 先看效果图: 01输入框焦点效果 02效果 模仿淘宝的分页按钮效果控件kkpager  JS ...

  8. web——自己实现一个淘宝购物车页面

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. Android仿淘宝购物车demo

    夏的热情渐渐退去,秋如期而至,丰收的季节,小编继续着实习之路,走着走着,就走到了购物车,逛过淘宝或者是京东的小伙伴都知道购物车里面的宝贝可不止一件,对于爱购物的姑娘来说,购物车里面的商品恐怕是爆满,添 ...

随机推荐

  1. python中的*args和**kw

    学习python装饰器decorator的时候遇到*args和**kw两种函数值传递. 在python中定义函数,可以使用一般参数.默认参数.非关键字参数和关键字参数. 一般参数和默认参数在前面的学习 ...

  2. Delphi 中的 XMLDocument 类详解(10) - 判断节点类型: 支节点、叶节点、文本节点、空节点

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  3. PTA最短工期

    一个项目由若干个任务组成,任务之间有先后依赖顺序.项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务.现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工 ...

  4. JDK8新增接口的默认方法与静态方法

    JDK8之前,interface中可以定义常量和抽象方法,访问修饰符是public. public interface A { /** a1和a2写法是等价的 */ public static fin ...

  5. Jmeter学习之-从数据库取出数据并且校验数据是否准确

    https://www.cnblogs.com/wuyonghuan/p/7479582.html 应用场景:调用某个接口像数据库中插入数据,需要在接口调用完成后查看数据更新或插入的数据是否正确的时候 ...

  6. 接口测试工具-Jmeter使用笔记(七:用户定义的变量)

    使用场景:一组API根据业务流程制作成测试脚本,想要移植到其他测试环境时,由于数据库发生了变更,有些初始化数据也相应发生了变化,例如环境地址.请求路径等等.博主甚至把服务器地址和接口的部分共同请求路径 ...

  7. Remove menucool tooltip trial version

    You use this crack on your own risk , i dont reserve any right on this script or what is going to af ...

  8. 15.IEnumerable和IEnumerator

    先说IEnumerable,我们每天用的foreach你真的懂它吗? 阅读目录 自己实现迭代器 yield的使用 怎样高性能的随机取IEnumerable中的值 我们先思考几个问题: 为什么在fore ...

  9. python 字节转换成图像

    python 字节转换成图像 使用base64 1.图片转成字节使用:  base64.b64encode() 2.字节转成图片: base64.b64decode() 图片字节串: iVBORw0K ...

  10. Vue疑难杂症

    安装Vue脚手架的时候 指令:npm install vue-cli -g Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corpor ...