diff --git a/ShoppingCart-master/.gitignore b/ShoppingCart-master/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/ShoppingCart-master/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/ShoppingCart-master/.idea/codeStyles/Project.xml b/ShoppingCart-master/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/ShoppingCart-master/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/ShoppingCart-master/.idea/gradle.xml b/ShoppingCart-master/.idea/gradle.xml new file mode 100644 index 0000000..d291b3d --- /dev/null +++ b/ShoppingCart-master/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/.idea/inspectionProfiles/Project_Default.xml b/ShoppingCart-master/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6eb1e3c --- /dev/null +++ b/ShoppingCart-master/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,42 @@ + + + + \ No newline at end of file diff --git a/ShoppingCart-master/.idea/misc.xml b/ShoppingCart-master/.idea/misc.xml new file mode 100644 index 0000000..7bfef59 --- /dev/null +++ b/ShoppingCart-master/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/.idea/runConfigurations.xml b/ShoppingCart-master/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/ShoppingCart-master/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/.gitignore b/ShoppingCart-master/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/ShoppingCart-master/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/ShoppingCart-master/app/build.gradle b/ShoppingCart-master/app/build.gradle new file mode 100644 index 0000000..6e2c224 --- /dev/null +++ b/ShoppingCart-master/app/build.gradle @@ -0,0 +1,50 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + defaultConfig { + applicationId "com.llw.cart" + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + + //Gson解析 + implementation 'com.google.code.gson:gson:2.8.6' + //RecyclerView + implementation 'androidx.recyclerview:recyclerview:1.1.0' + //RecyclerView的好搭档 + implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22' + //热门强大的图片加载器 + implementation 'com.github.bumptech.glide:glide:4.9.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' + //下拉刷新框架 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14' + //没有使用特殊Header,可以不加这行 + implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-14' + + + +} diff --git a/ShoppingCart-master/app/proguard-rules.pro b/ShoppingCart-master/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/ShoppingCart-master/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/ShoppingCart-master/app/src/androidTest/java/com/llw/cart/ExampleInstrumentedTest.java b/ShoppingCart-master/app/src/androidTest/java/com/llw/cart/ExampleInstrumentedTest.java new file mode 100644 index 0000000..c207018 --- /dev/null +++ b/ShoppingCart-master/app/src/androidTest/java/com/llw/cart/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.llw.cart; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.llw.cart", appContext.getPackageName()); + } +} diff --git a/ShoppingCart-master/app/src/main/AndroidManifest.xml b/ShoppingCart-master/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..86e0ca1 --- /dev/null +++ b/ShoppingCart-master/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/java/com/llw/cart/MainActivity.java b/ShoppingCart-master/app/src/main/java/com/llw/cart/MainActivity.java new file mode 100644 index 0000000..d47bafc --- /dev/null +++ b/ShoppingCart-master/app/src/main/java/com/llw/cart/MainActivity.java @@ -0,0 +1,389 @@ +package com.llw.cart; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.google.gson.Gson; +import com.llw.cart.adapter.StoreAdapter; +import com.llw.cart.bean.CarResponse; +import com.llw.cart.util.Constant; +import com.llw.cart.util.GoodsCallback; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 购物车 + * + * @author llw + */ +public class MainActivity extends AppCompatActivity implements GoodsCallback, View.OnClickListener { + + public static final String TAG = "MainActivity"; + + private RecyclerView rvStore; + private StoreAdapter storeAdapter; + private List mList = new ArrayList<>(); + private TextView tvEdit;//编辑 + private ImageView ivCheckedAll;//全选 + private TextView tvTotal;//合计价格 + private TextView tvSettlement;//结算 + private LinearLayout layEdit;//编辑底部布局 + private TextView tvShareGoods;//分享商品 + private TextView tvCollectGoods;//收藏商品 + private TextView tvDeleteGoods;//删除商品 + + private boolean isEdit = false;//是否编辑 + private boolean isAllChecked = false;//是否全选 + + private List shopIdList = new ArrayList<>();//店铺列表 + + private double totalPrice = 0.00;//商品总价 + private int totalCount = 0;//商品总数量 + + private AlertDialog dialog;//弹窗 + + private boolean isHaveGoods = false;//购物车是否有商品 + + private SmartRefreshLayout refresh;//刷新布局 + private LinearLayout layEmpty;//空布局 + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + initView(); + } + + /** + * 初始化 + */ + private void initView() { + //设置亮色状态栏模式 systemUiVisibility在Android11中弃用了,可以尝试一下。 + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + + rvStore = findViewById(R.id.rv_store); + tvEdit = findViewById(R.id.tv_edit); + ivCheckedAll = findViewById(R.id.iv_checked_all); + tvTotal = findViewById(R.id.tv_total); + tvSettlement = findViewById(R.id.tv_settlement); + layEdit = findViewById(R.id.lay_edit); + tvShareGoods = findViewById(R.id.tv_share_goods); + tvCollectGoods = findViewById(R.id.tv_collect_goods); + tvDeleteGoods = findViewById(R.id.tv_delete_goods); + refresh = findViewById(R.id.refresh); + layEmpty = findViewById(R.id.lay_empty); + //禁用下拉刷新和上拉加载更多 + refresh.setEnableRefresh(false); + refresh.setEnableLoadMore(false); + //下拉刷新监听 + refresh.setOnRefreshListener(refreshLayout -> initView()); + + tvEdit.setOnClickListener(this); + ivCheckedAll.setOnClickListener(this); + tvSettlement.setOnClickListener(this); + tvShareGoods.setOnClickListener(this); + tvCollectGoods.setOnClickListener(this); + tvDeleteGoods.setOnClickListener(this); + + CarResponse carResponse = new Gson().fromJson(Constant.CAR_JSON, CarResponse.class); + + mList.addAll(carResponse.getOrderData()); + storeAdapter = new StoreAdapter(R.layout.item_store, mList, this); + rvStore.setLayoutManager(new LinearLayoutManager(this)); + rvStore.setAdapter(storeAdapter); + //店铺点击 + storeAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { + @Override + public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { + CarResponse.OrderDataBean storeBean = mList.get(position); + if (view.getId() == R.id.iv_checked_store) { + storeBean.setChecked(!storeBean.isChecked()); + storeAdapter.notifyDataSetChanged(); + //传递选中店铺的id + if (storeBean.isChecked()) { + //全选商品 + storeAdapter.controlGoods(storeBean.getShopId(), true); + + //添加到列表中 + if (!shopIdList.contains(storeBean.getShopId())) { + //如果列表中没有这个店铺Id且当前店铺为选中状态 + shopIdList.add(storeBean.getShopId()); + } + } else { + //清除全选商品 + storeAdapter.controlGoods(storeBean.getShopId(), false); + + //从列表中清除 + if (shopIdList.contains(storeBean.getShopId())) { + shopIdList.remove((Integer) storeBean.getShopId()); + } + } + //控制页面全选 + controlAllChecked(); + } + } + }); + //有商品 + isHaveGoods = true; + //下拉加载数据完成后,关闭下拉刷新动画 + refresh.finishRefresh(); + //隐藏布局 + layEmpty.setVisibility(View.GONE); + } + + /** + * 控制页面全选 与页面全选进行交互 + */ + private void controlAllChecked() { + if (shopIdList.size() == mList.size() && mList.size() != 0) { + //全选 + ivCheckedAll.setImageDrawable(getDrawable(R.drawable.ic_checked)); + isAllChecked = true; + } else { + //不全选 + ivCheckedAll.setImageDrawable(getDrawable(R.drawable.ic_check)); + isAllChecked = false; + } + //计算价格 + calculationPrice(); + } + + /** + * 选中店铺 + * + * @param shopId 店铺id + */ + @Override + public void checkedStore(int shopId, boolean state) { + for (CarResponse.OrderDataBean bean : mList) { + //遍历 + if (shopId == bean.getShopId()) { + bean.setChecked(state); + storeAdapter.notifyDataSetChanged(); + //记录选中店铺的shopid,添加到一个列表中。 + if (!shopIdList.contains(bean.getShopId()) && state) { + //如果列表中没有这个店铺Id且当前店铺为选中状态 + shopIdList.add(bean.getShopId()); + } else { + if (shopIdList.contains(bean.getShopId())) { + //通过list.indexOf获取属性的在列表中的下标,不过强转Integer更简洁 + shopIdList.remove((Integer) bean.getShopId()); + } + } + } + } + //控制页面全选 + controlAllChecked(); + } + + + /** + * 商品价格 + */ + @Override + public void calculationPrice() { + //每次计算之前先置零 + totalPrice = 0.00; + totalCount = 0; + //循环购物车中的店铺列表 + for (int i = 0; i < mList.size(); i++) { + CarResponse.OrderDataBean orderDataBean = mList.get(i); + //循环店铺中的商品列表 + for (int j = 0; j < orderDataBean.getCartlist().size(); j++) { + CarResponse.OrderDataBean.CartlistBean cartlistBean = orderDataBean.getCartlist().get(j); + //当有选中商品时计算数量和价格 + if (cartlistBean.isChecked()) { + totalCount++; + totalPrice += cartlistBean.getPrice() * cartlistBean.getCount(); + } + } + } + tvTotal.setText("¥" + totalPrice); + tvSettlement.setText(totalCount == 0 ? "结算" : "结算(" + totalCount + ")"); + } + + /** + * 页面控件点击事件 + * + * @param v + */ + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.tv_edit://编辑 + if (!isHaveGoods) { + showMsg("当前购物车空空如也~"); + return; + } + if (isEdit) { + tvEdit.setText("编辑"); + layEdit.setVisibility(View.GONE); + isEdit = false; + } else { + tvEdit.setText("完成"); + layEdit.setVisibility(View.VISIBLE); + isEdit = true; + } + break; + case R.id.iv_checked_all://全选 + if (!isHaveGoods) { + showMsg("当前购物车空空如也~"); + return; + } + if (isAllChecked) { + //取消全选 + isSelectAllStore(false); + } else { + //全选 + isSelectAllStore(true); + } + break; + case R.id.tv_settlement://结算 + if (!isHaveGoods) { + showMsg("当前购物车空空如也~"); + return; + } + if (totalCount == 0) { + showMsg("请选择要结算的商品"); + return; + } + //弹窗 + dialog = new AlertDialog.Builder(this) + .setMessage("总计:" + totalCount + "种商品," + totalPrice + "元") + .setPositiveButton("确定", (dialog, which) -> deleteGoods()) + .setNegativeButton("取消", (dialog, which) -> dialog.dismiss()) + .create(); + dialog.show(); + break; + case R.id.tv_delete_goods://删除 + if (totalCount == 0) { + showMsg("请选择要删除的商品"); + return; + } + //弹窗 + dialog = new AlertDialog.Builder(this) + .setMessage("确定要删除所选商品吗?") + .setPositiveButton("确定", (dialog, which) -> deleteGoods()) + .setNegativeButton("取消", (dialog, which) -> dialog.dismiss()) + .create(); + dialog.show(); + break; + case R.id.tv_collect_goods://收藏 + if (totalCount == 0) { + showMsg("请选择要收藏的商品"); + return; + } + showMsg("收藏成功!"); + break; + case R.id.tv_share_goods://分享 + if (totalCount == 0) { + showMsg("请选择要分享的商品"); + return; + } + showMsg("分享成功!"); + break; + default: + break; + } + } + + /** + * 删除商品 + */ + private void deleteGoods() { + //店铺列表 + List storeList = new ArrayList<>(); + + for (int i = 0; i < mList.size(); i++) { + CarResponse.OrderDataBean store = mList.get(i); + if (store.isChecked()) { + //店铺如果选择则添加到此列表中 + storeList.add(store); + } + //商品列表 + List goodsList = new ArrayList<>(); + + List goods = store.getCartlist(); + //循环店铺中的商品列表 + for (int j = 0; j < goods.size(); j++) { + CarResponse.OrderDataBean.CartlistBean cartlistBean = goods.get(j); + //当有选中商品时添加到此列表中 + if (cartlistBean.isChecked()) { + goodsList.add(cartlistBean); + } + } + //删除商品 + goods.removeAll(goodsList); + } + //删除店铺 + mList.removeAll(storeList); + + shopIdList.clear();//删除了选中商品,清空已选择的标识 + controlAllChecked();//控制去全选 + //改变界面UI + tvEdit.setText("编辑"); + layEdit.setVisibility(View.GONE); + isEdit = false; + //刷新数据 + storeAdapter.notifyDataSetChanged(); + if (mList.size() <= 0) { + //无商品 + isHaveGoods = false; + //启用下拉刷新 + refresh.setEnableRefresh(true); + //显示空布局 + layEmpty.setVisibility(View.VISIBLE); + } + } + + /** + * 是否全选 + * + * @param state 状态 + */ + private void isSelectAllStore(boolean state) { + //修改背景 + ivCheckedAll.setImageDrawable(getDrawable(state ? R.drawable.ic_checked : R.drawable.ic_check)); + + for (CarResponse.OrderDataBean orderDataBean : mList) { + //商品是否选中 + storeAdapter.controlGoods(orderDataBean.getShopId(), state); + //店铺是否选中 + checkedStore(orderDataBean.getShopId(), state); + } + isAllChecked = state; + } + + /** + * Toast提示 + * + * @param msg + */ + private void showMsg(String msg) { + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); + } + + +} diff --git a/ShoppingCart-master/app/src/main/java/com/llw/cart/adapter/GoodsAdapter.java b/ShoppingCart-master/app/src/main/java/com/llw/cart/adapter/GoodsAdapter.java new file mode 100644 index 0000000..8e84b62 --- /dev/null +++ b/ShoppingCart-master/app/src/main/java/com/llw/cart/adapter/GoodsAdapter.java @@ -0,0 +1,49 @@ +package com.llw.cart.adapter; + +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.llw.cart.bean.CarResponse; +import com.llw.cart.R; + +import java.util.List; + +/** + * 商品适配器 + * + * @author llw + */ +public class GoodsAdapter extends BaseQuickAdapter { + + public GoodsAdapter(int layoutResId, @Nullable List data) { + super(layoutResId, data); + } + + @Override + protected void convert(BaseViewHolder helper, CarResponse.OrderDataBean.CartlistBean item) { + helper.setText(R.id.tv_good_name, item.getProductName()) + .setText(R.id.tv_good_color, item.getColor()) + .setText(R.id.tv_good_size, item.getSize()) + .setText(R.id.tv_goods_price, item.getPrice() + "") + .setText(R.id.tv_goods_num, item.getCount() + ""); + ImageView goodImg = helper.getView(R.id.iv_goods); + Glide.with(mContext).load(item.getDefaultPic()).into(goodImg); + + ImageView checkedGoods = helper.getView(R.id.iv_checked_goods); + //判断商品是否选中 + if (item.isChecked()) { + checkedGoods.setImageDrawable(mContext.getDrawable(R.drawable.ic_checked)); + } else { + checkedGoods.setImageDrawable(mContext.getDrawable(R.drawable.ic_check)); + } + //添加点击事件 + helper.addOnClickListener(R.id.iv_checked_goods)//选中商品 + .addOnClickListener(R.id.tv_increase_goods_num)//增加商品 + .addOnClickListener(R.id.tv_reduce_goods_num);//减少商品 + } +} diff --git a/ShoppingCart-master/app/src/main/java/com/llw/cart/adapter/StoreAdapter.java b/ShoppingCart-master/app/src/main/java/com/llw/cart/adapter/StoreAdapter.java new file mode 100644 index 0000000..bf4d4c6 --- /dev/null +++ b/ShoppingCart-master/app/src/main/java/com/llw/cart/adapter/StoreAdapter.java @@ -0,0 +1,155 @@ +package com.llw.cart.adapter; + +import android.view.View; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.llw.cart.MainActivity; +import com.llw.cart.bean.CarResponse; +import com.llw.cart.R; +import com.llw.cart.util.GoodsCallback; + +import java.util.List; + +/** + * 店铺适配器 + * + * @author llw + */ +public class StoreAdapter extends BaseQuickAdapter { + + private RecyclerView rvGood; + //商品回调 + private GoodsCallback goodsCallback; + //店铺对象 + private List storeBean; + + public StoreAdapter(int layoutResId, @Nullable List data, GoodsCallback goodsCallback) { + super(layoutResId, data); + this.goodsCallback = goodsCallback; + storeBean = data;//赋值 + } + + @Override + protected void convert(BaseViewHolder helper, final CarResponse.OrderDataBean item) { + + rvGood = helper.getView(R.id.rv_goods); + helper.setText(R.id.tv_store_name, item.getShopName()); + + ImageView checkedStore = helper.getView(R.id.iv_checked_store); + if (item.isChecked()) { + checkedStore.setImageDrawable(mContext.getDrawable(R.drawable.ic_checked)); + } else { + checkedStore.setImageDrawable(mContext.getDrawable(R.drawable.ic_check)); + } + //点击事件 + helper.addOnClickListener(R.id.iv_checked_store);//选中店铺 + + + final GoodsAdapter goodsAdapter = new GoodsAdapter(R.layout.item_good, item.getCartlist()); + rvGood.setLayoutManager(new LinearLayoutManager(mContext)); + rvGood.setAdapter(goodsAdapter); + + //商品item中的点击事件 + goodsAdapter.setOnItemChildClickListener(new OnItemChildClickListener() { + @Override + public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { + CarResponse.OrderDataBean.CartlistBean goodsBean = item.getCartlist().get(position); + + switch (view.getId()) { + case R.id.iv_checked_goods://选中商品 + //如果已选中则取消选中,未选中则选中 + goodsBean.setChecked(!goodsBean.isChecked()); + //刷新适配器 + goodsAdapter.notifyDataSetChanged(); + //控制店铺是否选中 + controlStore(item); + //商品控制价格 + goodsCallback.calculationPrice(); + break; + case R.id.tv_increase_goods_num://增加商品数量 + updateGoodsNum(goodsBean, goodsAdapter,true); + break; + case R.id.tv_reduce_goods_num://减少商品数量 + updateGoodsNum(goodsBean, goodsAdapter,false); + break; + default: + break; + } + } + }); + + } + + /** + * 修改商品数量 增加或者减少 + * @param goodsBean + * @param goodsAdapter + * @param state true增加 false减少 + */ + private void updateGoodsNum(CarResponse.OrderDataBean.CartlistBean goodsBean, GoodsAdapter goodsAdapter,boolean state) { + //其实商品应该还有一个库存值或者其他的限定值,我这里写一个假的库存值为10 + int inventory = 10; + int count = goodsBean.getCount(); + + if(state){ + if (count >= inventory){ + Toast.makeText(mContext,"商品数量不可超过库存值~",Toast.LENGTH_SHORT).show(); + return; + } + count++; + }else { + if (count <= 1){ + Toast.makeText(mContext,"已是最低商品数量~",Toast.LENGTH_SHORT).show(); + return; + } + count--; + } + goodsBean.setCount(count);//设置商品数量 + //刷新适配器 + goodsAdapter.notifyDataSetChanged(); + //计算商品价格 + goodsCallback.calculationPrice(); + } + + /** + * 控制店铺是否选中 + */ + private void controlStore(CarResponse.OrderDataBean item) { + int num = 0; + for (CarResponse.OrderDataBean.CartlistBean bean : item.getCartlist()) { + if (bean.isChecked()) { + ++num; + } + } + if (num == item.getCartlist().size()) { + //全选中 传递需要选中的店铺的id过去 + goodsCallback.checkedStore(item.getShopId(), true); + } else { + goodsCallback.checkedStore(item.getShopId(), false); + } + } + + /** + * 控制商品是否选中 + */ + public void controlGoods(int shopId, boolean state) { + //根据店铺id选中该店铺下所有商品 + for (CarResponse.OrderDataBean orderDataBean : storeBean) { + //店铺id等于传递过来的店铺id 则选中该店铺下所有商品 + if (orderDataBean.getShopId() == shopId) { + for (CarResponse.OrderDataBean.CartlistBean cartlistBean : orderDataBean.getCartlist()) { + cartlistBean.setChecked(state); + //刷新 + notifyDataSetChanged(); + } + } + } + } +} diff --git a/ShoppingCart-master/app/src/main/java/com/llw/cart/bean/CarResponse.java b/ShoppingCart-master/app/src/main/java/com/llw/cart/bean/CarResponse.java new file mode 100644 index 0000000..236bb79 --- /dev/null +++ b/ShoppingCart-master/app/src/main/java/com/llw/cart/bean/CarResponse.java @@ -0,0 +1,196 @@ +package com.llw.cart.bean; + +import java.util.List; + +/** + * 购物车返回数据 + * @author llw + */ +public class CarResponse { + + + /** + * code : 200 + * orderData : [{"shopId":1,"shopName":"京东自营","cartlist":[{"id":1,"shopId":1,"shopName":"京东自营","defaultPic":"https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg","productId":1,"productName":"三只松鼠_零食大礼包","color":"黑色","size":"18L","price":20,"count":1},{"id":2,"shopId":1,"shopName":"京东自营","defaultPic":"https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg","productId":2,"productName":"小米心跳手环","color":"白色","size":"20XXL","price":148,"count":1}]},{"shopId":2,"shopName":"海澜之家","cartlist":[{"id":1,"shopId":2,"shopName":"海澜之家","defaultPic":"https://img30.360buyimg.com/popWaterMark/jfs/t4075/83/1343091204/132469/9034cb9c/5873496bN68020ba8.jpg","productId":1,"productName":"短袖T恤男 2017夏季新品","color":"蓝色","size":"30X","price":181,"count":1}]},{"shopId":3,"shopName":"OPPO官方旗舰店","cartlist":[{"id":1,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg","productId":1,"productName":"OPPO R11 全网通","color":"蓝色","size":"30X","price":1999,"count":1},{"id":2,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg","productId":1,"productName":"OPPO R9 全网通","color":"蓝色","size":"30X","price":999,"count":1}]}] + */ + + + private int code; + private List orderData; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getOrderData() { + return orderData; + } + + public void setOrderData(List orderData) { + this.orderData = orderData; + } + + public static class OrderDataBean { + /** + * shopId : 1 + * shopName : 京东自营 + * cartlist : [{"id":1,"shopId":1,"shopName":"京东自营","defaultPic":"https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg","productId":1,"productName":"三只松鼠_零食大礼包","color":"黑色","size":"18L","price":20,"count":1},{"id":2,"shopId":1,"shopName":"京东自营","defaultPic":"https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg","productId":2,"productName":"小米心跳手环","color":"白色","size":"20XXL","price":148,"count":1}] + */ + + private int shopId; + private String shopName; + private List cartlist; + private boolean isChecked;//店铺是否选中 + + public int getShopId() { + return shopId; + } + + public void setShopId(int shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getCartlist() { + return cartlist; + } + + public void setCartlist(List cartlist) { + this.cartlist = cartlist; + } + + public boolean isChecked() { + return isChecked; + } + + public void setChecked(boolean checked) { + isChecked = checked; + } + + public static class CartlistBean { + /** + * id : 1 + * shopId : 1 + * shopName : 京东自营 + * defaultPic : https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg + * productId : 1 + * productName : 三只松鼠_零食大礼包 + * color : 黑色 + * size : 18L + * price : 20 + * count : 1 + */ + + private int id; + private int shopId; + private String shopName; + private String defaultPic; + private int productId; + private String productName; + private String color; + private String size; + private int price; + private int count; + private boolean isChecked;//商品是否选中 + + public boolean isChecked() { + return isChecked; + } + + public void setChecked(boolean checked) { + isChecked = checked; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getShopId() { + return shopId; + } + + public void setShopId(int shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getDefaultPic() { + return defaultPic; + } + + public void setDefaultPic(String defaultPic) { + this.defaultPic = defaultPic; + } + + public int getProductId() { + return productId; + } + + public void setProductId(int productId) { + this.productId = productId; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + } + } +} diff --git a/ShoppingCart-master/app/src/main/java/com/llw/cart/util/Constant.java b/ShoppingCart-master/app/src/main/java/com/llw/cart/util/Constant.java new file mode 100644 index 0000000..6fdf7e7 --- /dev/null +++ b/ShoppingCart-master/app/src/main/java/com/llw/cart/util/Constant.java @@ -0,0 +1,95 @@ +package com.llw.cart.util; + +/** + * 常量 + * @author llw + */ +public class Constant { + + public static final String CAR_JSON = "{ \"code\" : 200 ,\n" + + " \"orderData\" : [\n" + + " {\n" + + "\n" + + " \"shopId\": 1,\n" + + " \"shopName\":\"京东自营\",\n" + + " \"cartlist\": [\n" + + " {\n" + + " \"id\": 1,\n" + + " \"shopId\": 1,\n" + + " \"shopName\": \"京东自营\",\n" + + " \"defaultPic\": \"https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg\",\n" + + " \"productId\": 1,\n" + + " \"productName\": \"三只松鼠_零食大礼包\",\n" + + " \"color\": \"黑色\",\n" + + " \"size\": \"18L\",\n" + + " \"price\": 20,\n" + + " \"count\":1\n" + + " },\n" + + " {\n" + + " \"id\": 2,\n" + + " \"shopId\": 1,\n" + + " \"shopName\": \"京东自营\",\n" + + " \"defaultPic\": \"https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg\",\n" + + " \"productId\": 2,\n" + + " \"productName\": \"小米心跳手环\",\n" + + " \"color\": \"白色\",\n" + + " \"size\": \"20XXL\",\n" + + " \"price\": 148,\n" + + " \"count\": 1\n" + + " }\n" + + " ]\n" + + " }\n" + + " ,\n" + + " {\n" + + " \"shopId\": 2,\n" + + " \"shopName\":\"海澜之家\",\n" + + " \"cartlist\": [\n" + + " {\n" + + " \"id\": 1,\n" + + " \"shopId\": 2,\n" + + " \"shopName\": \"海澜之家\",\n" + + " \"defaultPic\": \"https://img30.360buyimg.com/popWaterMark/jfs/t4075/83/1343091204/132469/9034cb9c/5873496bN68020ba8.jpg\",\n" + + " \"productId\": 1,\n" + + " \"productName\": \"短袖T恤男 2017夏季新品\",\n" + + " \"color\": \"蓝色\",\n" + + " \"size\": \"30X\",\n" + + " \"price\": 181,\n" + + " \"count\":1\n" + + " }\n" + + " ]\n" + + " }\n" + + " ,\n" + + " {\n" + + " \"shopId\": 3,\n" + + " \"shopName\":\"OPPO官方旗舰店\",\n" + + " \"cartlist\": [\n" + + " {\n" + + " \"id\": 1,\n" + + " \"shopId\": 3,\n" + + " \"shopName\": \"OPPO官方旗舰店\",\n" + + " \"defaultPic\": \"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg\",\n" + + " \"productId\": 1,\n" + + " \"productName\": \"OPPO R11 全网通\",\n" + + " \"color\": \"蓝色\",\n" + + " \"size\": \"30X\",\n" + + " \"price\": 1999,\n" + + " \"count\":1\n" + + " },\n" + + " {\n" + + " \"id\": 2,\n" + + " \"shopId\": 3,\n" + + " \"shopName\": \"OPPO官方旗舰店\",\n" + + " \"defaultPic\": \"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg\",\n" + + " \"productId\": 1,\n" + + " \"productName\": \"OPPO R9 全网通\",\n" + + " \"color\": \"蓝色\",\n" + + " \"size\": \"30X\",\n" + + " \"price\": 999,\n" + + " \"count\":1\n" + + " }\n" + + " ]\n" + + " }\n" + + "\n" + + " ]\n" + + "}"; +} diff --git a/ShoppingCart-master/app/src/main/java/com/llw/cart/util/GoodsCallback.java b/ShoppingCart-master/app/src/main/java/com/llw/cart/util/GoodsCallback.java new file mode 100644 index 0000000..7e52b75 --- /dev/null +++ b/ShoppingCart-master/app/src/main/java/com/llw/cart/util/GoodsCallback.java @@ -0,0 +1,21 @@ +package com.llw.cart.util; + + +/** + * 商品回调接口 + * @author llw + */ +public interface GoodsCallback { + + /** + * 选中店铺 + * @param shopId 店铺id + * @param state 是否选中 + */ + void checkedStore(int shopId,boolean state); + + /** + * 计算价格 + */ + void calculationPrice(); +} diff --git a/ShoppingCart-master/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/ShoppingCart-master/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/ShoppingCart-master/app/src/main/res/drawable/bg_goods_num.xml b/ShoppingCart-master/app/src/main/res/drawable/bg_goods_num.xml new file mode 100644 index 0000000..7ef60a2 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/bg_goods_num.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/drawable/bg_increase_goods_num.xml b/ShoppingCart-master/app/src/main/res/drawable/bg_increase_goods_num.xml new file mode 100644 index 0000000..d049da2 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/bg_increase_goods_num.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/drawable/bg_reduce_goods_num.xml b/ShoppingCart-master/app/src/main/res/drawable/bg_reduce_goods_num.xml new file mode 100644 index 0000000..f071253 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/bg_reduce_goods_num.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/drawable/bg_settlement.xml b/ShoppingCart-master/app/src/main/res/drawable/bg_settlement.xml new file mode 100644 index 0000000..be029bd --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/bg_settlement.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/drawable/bg_white_8.xml b/ShoppingCart-master/app/src/main/res/drawable/bg_white_8.xml new file mode 100644 index 0000000..5adf7f0 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/bg_white_8.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/drawable/ic_check.xml b/ShoppingCart-master/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 0000000..c3f13f5 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,10 @@ + + + + diff --git a/ShoppingCart-master/app/src/main/res/drawable/ic_checked.xml b/ShoppingCart-master/app/src/main/res/drawable/ic_checked.xml new file mode 100644 index 0000000..9d7471b --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/ic_checked.xml @@ -0,0 +1,10 @@ + + + + diff --git a/ShoppingCart-master/app/src/main/res/drawable/ic_launcher_background.xml b/ShoppingCart-master/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ShoppingCart-master/app/src/main/res/drawable/ic_shopping_cart.xml b/ShoppingCart-master/app/src/main/res/drawable/ic_shopping_cart.xml new file mode 100644 index 0000000..6c489be --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/drawable/ic_shopping_cart.xml @@ -0,0 +1,11 @@ + + + + diff --git a/ShoppingCart-master/app/src/main/res/layout/activity_main.xml b/ShoppingCart-master/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..9338a2d --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/layout/item_good.xml b/ShoppingCart-master/app/src/main/res/layout/item_good.xml new file mode 100644 index 0000000..f6539b4 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/layout/item_good.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/layout/item_store.xml b/ShoppingCart-master/app/src/main/res/layout/item_store.xml new file mode 100644 index 0000000..9c86de0 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/layout/item_store.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/ShoppingCart-master/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/ShoppingCart-master/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/main/res/mipmap-hdpi/ic_launcher.png b/ShoppingCart-master/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..898f3ed Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/ShoppingCart-master/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..dffca36 Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-mdpi/ic_launcher.png b/ShoppingCart-master/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..64ba76f Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/ShoppingCart-master/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..dae5e08 Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/ShoppingCart-master/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e5ed465 Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/ShoppingCart-master/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..14ed0af Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ShoppingCart-master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0907ca Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/ShoppingCart-master/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..d8ae031 Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/ShoppingCart-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2c18de9 Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/ShoppingCart-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/ShoppingCart-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..beed3cd Binary files /dev/null and b/ShoppingCart-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/ShoppingCart-master/app/src/main/res/values/colors.xml b/ShoppingCart-master/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..60c7b79 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #FFF + #FFF + #D81B60 + diff --git a/ShoppingCart-master/app/src/main/res/values/strings.xml b/ShoppingCart-master/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..5e7c5c6 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + ShoppingCart + diff --git a/ShoppingCart-master/app/src/main/res/values/styles.xml b/ShoppingCart-master/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..0eb88fe --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/ShoppingCart-master/app/src/main/res/xml/network_config.xml b/ShoppingCart-master/app/src/main/res/xml/network_config.xml new file mode 100644 index 0000000..dca93c0 --- /dev/null +++ b/ShoppingCart-master/app/src/main/res/xml/network_config.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ShoppingCart-master/app/src/test/java/com/llw/cart/ExampleUnitTest.java b/ShoppingCart-master/app/src/test/java/com/llw/cart/ExampleUnitTest.java new file mode 100644 index 0000000..89f9a0b --- /dev/null +++ b/ShoppingCart-master/app/src/test/java/com/llw/cart/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.llw.cart; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/ShoppingCart-master/build.gradle b/ShoppingCart-master/build.gradle new file mode 100644 index 0000000..2de925a --- /dev/null +++ b/ShoppingCart-master/build.gradle @@ -0,0 +1,28 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + google() + jcenter() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.2' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + maven { url "https://jitpack.io" } + + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/ShoppingCart-master/gradle.properties b/ShoppingCart-master/gradle.properties new file mode 100644 index 0000000..199d16e --- /dev/null +++ b/ShoppingCart-master/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + diff --git a/ShoppingCart-master/gradle/wrapper/gradle-wrapper.jar b/ShoppingCart-master/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/ShoppingCart-master/gradle/wrapper/gradle-wrapper.jar differ diff --git a/ShoppingCart-master/gradle/wrapper/gradle-wrapper.properties b/ShoppingCart-master/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..dfc09e1 --- /dev/null +++ b/ShoppingCart-master/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 07 09:36:35 CST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/ShoppingCart-master/gradlew b/ShoppingCart-master/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/ShoppingCart-master/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/ShoppingCart-master/gradlew.bat b/ShoppingCart-master/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/ShoppingCart-master/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/ShoppingCart-master/settings.gradle b/ShoppingCart-master/settings.gradle new file mode 100644 index 0000000..b24308d --- /dev/null +++ b/ShoppingCart-master/settings.gradle @@ -0,0 +1,2 @@ +include ':app' +rootProject.name='ShoppingCart'