From a10de2e4b225bb63f515380589412eba43c962a9 Mon Sep 17 00:00:00 2001 From: itgaojian163 Date: Sat, 24 Dec 2022 17:39:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=B4=AD=E7=89=A9=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/retrofit_net/BaseUrlApi.java | 5 +- .../core/widget/base/BaseActivity.java | 9 + .../core/widget/base/BaseFragment.java | 5 + .../core/widget/base/BaseRecyclerAdapter.java | 2 +- .../res/drawable-xhdpi/ic_add_circle_icon.png | Bin 868 -> 809 bytes .../res/drawable-xhdpi/ic_del_circle_icon.png | Bin 750 -> 696 bytes .../main/res/drawable/shape_circle_grad.xml | 11 ++ .../src/main/res/layout/layout_add_delete.xml | 5 +- moduleshop/build.gradle | 1 + .../activitys/GoodsDetailActivity.java | 29 ++- .../activitys/GoodsListActivity.java | 19 +- .../moduleshop/activitys/ShopCarActivity.java | 177 +++++++++++++++--- .../moduleshop/adapter/CarGoodsAdapter.java | 49 ++++- .../moduleshop/adapter/GoodsCarAdapter.java | 12 ++ .../moduleshop/beans/GoodsStandardBean.java | 23 +-- .../moduleshop/beans/ShopGoodsDetailBean.java | 61 +++++- .../fragments/ShopSortFragment.java | 13 ++ .../moduleshop/holder/CarGoodsHolder.java | 10 + .../tenlionsoft/moduleshop/net/ShopApi.java | 13 ++ .../moduleshop/utils/TreeUtils.java | 143 ++++++++++++++ .../main/res/layout/activity_goods_list.xml | 27 +++ .../src/main/res/layout/activity_shop_car.xml | 52 ++++- .../main/res/layout/fragment_shop_sort.xml | 27 +++ .../src/main/res/layout/item_car_goods.xml | 70 +++++-- 24 files changed, 679 insertions(+), 84 deletions(-) create mode 100755 cm_utils/src/main/res/drawable/shape_circle_grad.xml create mode 100644 moduleshop/src/main/java/com/tenlionsoft/moduleshop/utils/TreeUtils.java diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java index 611ab62..0397ea8 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/retrofit_net/BaseUrlApi.java @@ -10,12 +10,13 @@ import com.sucstepsoft.cm_utils.constant.PathConfig; public class BaseUrlApi { // public static final String IP = "http://192.168.0.113:7001/usercenter/";/* 测试IP */ - public static final String IP = "http://49.233.36.36:58099/xzszwhy/";/* 测试IP */ +// public static final String IP = "http://49.233.36.36:58099/xzszwhy/";/* 测试IP */ + public static final String IP = "http://v3.xzszwhy.cn/xzszwhy/";/* 测试IP */ public static final String IP_URL = "http://v3.xzszwhy.cn/";/* 测试IP */ // public static final String IP = "https://www.wgink.ink/usercenter/";/* 正式IP */ // public static final String IP = "https://www.xzszwhy.cn/usercenter/";/* 正式IP */ // public static final String BASE_SYSTEM_IP = "http://192.168.0.115:8082/"; - public static final String BASE_SYSTEM_IP = "http://49.233.36.36:58099/xzszwhy/"; + public static final String BASE_SYSTEM_IP = "http://v3.xzszwhy.cn/xzszwhy/"; // public static final String BASE_SYSTEM_IP = "https://www.xzszwhy.cn/"; // public static final String IP = "http://192.168.0.113:7001/usercenter/";/* 测试IP */ public static final String PROJECT_NAME = "app/"; diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java index bf76e5d..02d20e2 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseActivity.java @@ -618,6 +618,15 @@ public abstract class BaseActivity extends AppCompatActivity { } } + /** + * 是否登录 + * + * @return + */ + protected boolean isLogin() { + return !TextUtils.isEmpty(UserLgUtils.getToken()); + } + /** * 将view的点击区域放大 * diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseFragment.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseFragment.java index a742bd1..b1024e2 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseFragment.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseFragment.java @@ -3,6 +3,7 @@ package com.sucstepsoft.cm_utils.core.widget.base; import android.app.Activity; import android.content.Context; import android.os.Bundle; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,6 +18,7 @@ import androidx.fragment.app.Fragment; import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.sucstepsoft.cm_utils.R; +import com.sucstepsoft.cm_utils.utils.UserLgUtils; public abstract class BaseFragment extends Fragment { public static final int STATE_LOAD = 1234;//加载中 @@ -158,6 +160,9 @@ public abstract class BaseFragment extends Fragment { return null; } + protected boolean isLogin() { + return !TextUtils.isEmpty(UserLgUtils.getToken()); + } // @Override // public void onDetach() { // super.onDetach(); diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseRecyclerAdapter.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseRecyclerAdapter.java index 47a7fe0..dd6540f 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseRecyclerAdapter.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BaseRecyclerAdapter.java @@ -133,7 +133,7 @@ public abstract class BaseRecyclerAdapter this.mListener = listener; } - private OnItemPositionClickListener mPosListener; + protected OnItemPositionClickListener mPosListener; public void addOnItemPosClickListener(OnItemPositionClickListener listener) { this.mPosListener = listener; diff --git a/cm_utils/src/main/res/drawable-xhdpi/ic_add_circle_icon.png b/cm_utils/src/main/res/drawable-xhdpi/ic_add_circle_icon.png index cbd3aca757945efb673ac61d21498feb286c59d3..09f0577a04a5d25c459c0e4d0da22ee1bf929241 100644 GIT binary patch delta 773 zcmV+g1N!{r2B`*+Fn<g$ zF7Bz+F~TUQ4teOL5_Bo(R2G%1R2Mr071S*uLP+Tl)G0_PHr<(>G1SZE&J&}}I%ChJbKeLb?RTWd`<+&`nLKdaeP1(=9NI}E`X1t{e) zaJeiC;_GrwzqghBmH-nm@q|J2(q~|YnZX!2t7^lQd{qR<#H1@A+^!y+r@%bIhLB?c zX@M|QO)oH??0;4DSLK>b0GUMe6quj8uAGf7SzVkmb(vVC6C}KKvk?qB+?&sTu2ATvjxPZ6+?U8vwu`=M??O2vD%J4kzOY=_)gBx;p~=0RTi8?8|AlHUT`5 zq@Ak)eD+#uz5#$AMxc=DpIOGw9w@y5&QO@EDFfHnWb7v-FO*9j08ZxHBO zT>!vSvZ8l605WmuJ%FS20RWm6ttkx@N{28LkA4OCzy`p2om-{m6|7wMI2PMefH6?s zC%B0H{hIc@1TY?#mKbO$Ik45a-{6*Ar9Kg0p}j{{XKfjfmH{-^3jhXn$oc$?9pD>) z)_QFL0)IxEJij<+2QXV?yVrDYs|*1IgiuS*!orFTK)eIcg*pLzk`?WsqYP`kez%hW zCJgrfZO5eyOp4;Jl^}fqu-8i#wgHe`rC{n@F1O&wfcf$$CJnpY>lU0}fb!wQaT}UV zW0j0qFIn&jkPWhM$UY}l7)ZqPU>bGZ1|I_nfPS>BXwSABNUT4+ZAEP(88M&kQ}w6i z3;REZQj4;oW4Q&<&<_*)evR#JiIWlP2BRCG&Ps=rfN2IE7DB&Y3}ly7*Mn>y$-Iay z%_IYpPgs^2BX)r|&_ zezSjP405CT2QUt91^~b($hGwE0ID_xfT%$Ni~}f119%ZIzAQcy@{M13V^VbjL2m$| zbO~j;U72x30!*cMIwEf2fIsF`m25#7ZcGNm2asCI~%`Zf^2u@ipdQa7A~FpWD*d_5FI4izB4 zn`Kec=y`H#o}UNgxxW)zivQ?+4D45i$N_+fTYuuC$+kt06+>x9w4_RKf$R-xhjAH% z3jp@21uPFD83E+OE=#KkK<^b3%05!6sQqat{2l4qjC(=5X_gmJAn%6bipkfM$=(u6 zDSN6o>t@srL?V{fN+7wG73T=jPb}JEo|kpnUUxZtWEi^xLNgOL0NAPs@`H)nQ~zw) z;yTs^SPXQ^wpkQJ>cFUDkSPFz0TaL^fH4r{COin{9y^hItq6*LNZ&5(oq(|e00000 LNkvXXu0mjfvA%WP diff --git a/cm_utils/src/main/res/drawable-xhdpi/ic_del_circle_icon.png b/cm_utils/src/main/res/drawable-xhdpi/ic_del_circle_icon.png index f179b46844c747f6b7d261ab0d919a9d1f3b56c0..477058a62ea816853ca5fd19b23e8f3fe0bcbb11 100644 GIT binary patch delta 659 zcmV;E0&M;61-J!}F@JJNL_t(oN6nWzXcSQthW|6OYLSS{?A}c$2GT3O8XF%(h^U={ zMb@2-CWzR%jg=_`iP{8|C}c-XXPH$&8!dzsTG@$(g0N=iwLw&5jdNsQlilol-JS7v z1NZ#@ch8x7?!AP72le8ASBT*u%8$5^M~K~@k}I3PY}=Rtet&nX*D*jUqMVb6jxulz zz-S{Q23DByk|eAo4Ch5BFl_-IMwDqLOarv96Tyu+l$O|iaNf#2Z57uNKo{y00B5>0 z-ZYzOL9^^j%`}<s;ryr1Tt7JpGpGwh{m?HYhb5#^*ylpctANi-8;Y5$~UeXV%Z0O%sT4DhJ|0@Rhl z1JH$X0-$GuG%sss)+x02qG4nU-x~l?bpebS9{|9FWWsQ6djR(pWyjVKt@&YI_IR(E z&TbFD$Mkz^l%*}hv26B7u>`sZ#{n*EznVe71y{~5Cx2GIo4sUbNruj8k)tzu2 zpew!r5Px6RjNHANPPizP2?_Mv2Y?LA`8}1b{r?9GALcfESWV{R6#{RYAM~ zaHu~&C8agfKHW&G&9z*)0noKxAqcR*xEZ&cJIyrOK1}qeIu1q>z<8G+DVL?WDa-oM tDy}U+B{;CBStI&D9;aQVzvJnD0jPBbFnN?O$_xMi002ovPDHLkV1g;LGjIR^ delta 713 zcmV;)0yh1)1?~lqF@LB@L_t(oN5z**XcJKshX0ecap8mHW+qW_<5odIMbL$|2-ZjI z&MrhTQ>uc6y3uuUts4spYRNqfN6o!$f=3)3b?(ljBH%p@^p z(%H@2d;b4BXYSm4hOo>REwexV3E++pYqH(gMa+8$6k%X(A%6h^W*MAhqL=;!ygshf zk7g5V3Scr6+SlEMG0yV=5d3w;8CmktlZ6~6M&{<8Hv(x05ZA>`21XhQIgJxA8I|f( zz1X?{rY=4J*wTu5Ma)M-s;zDst^lSk_&<$p;f7R>UXBmrx_HFE!FB==@Hi^fp=!+< zfLK^uC&uY^ntzwHm~dk_rOs4p+W_L4ww)>e)(i8JCb4fv)Uw`{?<>u`%-*dEmRdIiWS2IvqFr1I9%iBko|-R-6Z1gSNFUU93P5^Me z&#*FyYE9RkFebz%>cXdXKyVJ5hn4#5q*b>oE<*5afVQ;;!tXgpC)~^(*Fd$=IN;wH z7Gq$XV_-uwAOw5`;mVhknz*>sc(}zi{4ps7nnHm<0RFCCFz*Gh6QBrz7f(+HB>_$X vcmtvr$mSA8CX;CrwwY<(&1t# + + + + + \ No newline at end of file diff --git a/cm_utils/src/main/res/layout/layout_add_delete.xml b/cm_utils/src/main/res/layout/layout_add_delete.xml index 3e932af..7fe67a3 100644 --- a/cm_utils/src/main/res/layout/layout_add_delete.xml +++ b/cm_utils/src/main/res/layout/layout_add_delete.xml @@ -1,5 +1,6 @@ @@ -23,9 +24,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" + android:focusable="false" android:gravity="center" android:inputType="number" - android:minWidth="30dp" /> + android:minWidth="30dp" + tools:text="23" /> mStandardBeanList; private List mCarDatas = new ArrayList<>(); + private ShopGoodsDetailBean mCurrentBean; @Override protected int setLayoutId() { @@ -145,11 +146,15 @@ public class GoodsDetailActivity extends BaseActivity { } mStandardAdapter.addOnItemPosClickListener((b, p) -> { setPrice(b.getGoodsItemUnitPrice()); - mDetailBean.setGoodsPrice(b.getGoodsItemUnitPrice()+""); + mCurrentBean = mDetailBean.clone(); + mCurrentBean.setGoodsPrice(b.getGoodsItemUnitPrice()); + LogUtils.e("选中的类型===" + b.getGoodsItemId()); + mCurrentBean.setGoodsStandarId(b.getGoodsItemId()); + mCurrentBean.setGoodsStandarName(b.getGoodsItemName()); mTvGoodsStock.setText("库存:" + b.getGoodsItemTotal()); mStandardAdapter.setSelPos(p); }); - mTvAddCar.setOnClickListener(v -> addToCar(mDetailBean)); + mTvAddCar.setOnClickListener(v -> addToCar(mCurrentBean)); mLlCar.setOnClickListener(v -> ARouter.getInstance() .build(PathConfig.PATH_MODULE_SHOP_ACTIVITY_SHOP_CAR) .navigation()); @@ -179,27 +184,24 @@ public class GoodsDetailActivity extends BaseActivity { if (bean != null) { int pos = -1; for (int i = 0; i < mCarDatas.size(); i++) { - if (bean.getGoodsId().equals(mCarDatas.get(i).getGoodsId())) { + LogUtils.e(bean.getGoodsStandarId() + "==\n==" + mCarDatas.get(i).getGoodsStandarId()); + if (bean.getGoodsId().equals(mCarDatas.get(i).getGoodsId()) && bean.getGoodsStandarId().equals(mCarDatas.get(i).getGoodsStandarId())) { pos = i; break; } } if (pos != -1) { - LogUtils.e(pos + "====" + mCarDatas.get(pos).getCarAmount()); mCarDatas.get(pos).setCarAmount(mCarDatas.get(pos).getCarAmount() + 1); } else { bean.setCarAmount(1); - bean.setGoodsPrice(""); mCarDatas.add(bean); } } int num = 0; for (int i = 0; i < mCarDatas.size(); i++) { int carAmount = mCarDatas.get(i).getCarAmount(); - LogUtils.e(carAmount + "=============="); num += carAmount; } - LogUtils.e(num + "==数量=="); if (num > 99) { mTvCarAmount.setText("99+"); } else { @@ -378,6 +380,7 @@ public class GoodsDetailActivity extends BaseActivity { @Override public void onError(Throwable e) { + e.printStackTrace(); refreshView(STATE_LOAD_ERROR); ExceptionHandler.handleException(e); } @@ -412,6 +415,7 @@ public class GoodsDetailActivity extends BaseActivity { @Override public void onError(Throwable e) { + e.printStackTrace(); refreshView(STATE_LOAD_ERROR); ExceptionHandler.handleException(e); } @@ -430,10 +434,15 @@ public class GoodsDetailActivity extends BaseActivity { refreshView(STATE_LOAD_SUCCESS); GoodsStandardBean b = list.get(0); setPrice(b.getGoodsItemUnitPrice()); + mCurrentBean = mDetailBean.clone(); + mCurrentBean.setGoodsPrice(b.getGoodsItemUnitPrice()); + LogUtils.e("默认的===" + b.getGoodsItemId()); + mCurrentBean.setGoodsStandarId(b.getGoodsItemId()); + mCurrentBean.setGoodsStandarName(b.getGoodsItemName()); mTvGoodsStock.setText("库存:" + b.getGoodsItemTotal()); - mTvGoodsSales.setText("销量:" + mDetailBean.getGoodsSalesVolume()); - mTvGoodsEvaluate.setText("评分:" + mDetailBean.getUserEvaluate()); - mTvGoodsFreight.setText("1".equals(mDetailBean.getGoodsNotFreight()) ? "包邮" : "不包邮"); + mTvGoodsSales.setText("销量:" + mCurrentBean.getGoodsSalesVolume()); + mTvGoodsEvaluate.setText("评分:" + mCurrentBean.getUserEvaluate()); + mTvGoodsFreight.setText("1".equals(mCurrentBean.getGoodsNotFreight()) ? "包邮" : "不包邮"); mStandardBeanList.clear(); mStandardBeanList = list; mStandardAdapter.setData(mStandardBeanList); diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/GoodsListActivity.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/GoodsListActivity.java index 6a08238..67fae91 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/GoodsListActivity.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/GoodsListActivity.java @@ -4,6 +4,7 @@ import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -46,6 +47,8 @@ public class GoodsListActivity extends BaseActivity { ImageView mIvEData; @BindView(R2.id.tv_hint) TypeFaceTextView mTvEHint; + @BindView(R2.id.ll_car) + LinearLayout mLlCar; private int mCurrentPage = 1; private int mRows = 15; private String mCategoryId; @@ -88,6 +91,17 @@ public class GoodsListActivity extends BaseActivity { .build(PathConfig.PATH_MODULE_SHOP_ACTIVITY_GOODS_DETAIL) .withString("id", rowsBean.getGoodsId()) .navigation()); + mLlCar.setOnClickListener(v -> { + if (isLogin()) { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_SHOP_ACTIVITY_SHOP_CAR) + .navigation(); + } else { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_LOGIN) + .navigation(); + } + }); } /** @@ -135,7 +149,10 @@ public class GoodsListActivity extends BaseActivity { if (shopListBean.getRows() != null && shopListBean.getRows().size() > 0) { mDatas.addAll(shopListBean.getRows()); } else { - setStateView(STATE_LOAD_EMPTY); + mSrlContent.setNoMoreData(true); + if (mCurrentPage <= 1) { + setStateView(STATE_LOAD_EMPTY); + } } mAdapter.setData(mDatas); } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/ShopCarActivity.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/ShopCarActivity.java index 5c619f2..0178cb0 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/ShopCarActivity.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/activitys/ShopCarActivity.java @@ -1,6 +1,11 @@ package com.tenlionsoft.moduleshop.activitys; +import android.app.AlertDialog; +import android.text.SpannableString; +import android.text.Spanned; import android.text.TextUtils; +import android.text.style.RelativeSizeSpan; +import android.widget.CheckBox; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -10,10 +15,12 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.sucstepsoft.cm_utils.constant.PathConfig; import com.sucstepsoft.cm_utils.core.widget.base.BaseActivity; +import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.sucstepsoft.cm_utils.utils.LogUtils; import com.sucstepsoft.cm_utils.utils.UserLgUtils; import com.tengshisoft.moduleshop.R; import com.tengshisoft.moduleshop.R2; -import com.tenlionsoft.moduleshop.adapter.GoodsCarAdapter; +import com.tenlionsoft.moduleshop.adapter.CarGoodsAdapter; import com.tenlionsoft.moduleshop.beans.CustomCarBean; import com.tenlionsoft.moduleshop.beans.ShopGoodsDetailBean; @@ -31,9 +38,15 @@ import butterknife.ButterKnife; public class ShopCarActivity extends BaseActivity { @BindView(R2.id.rlv_car) RecyclerView mRlvCar; - private List mCarDatas; + @BindView(R2.id.cb_all) + CheckBox mCbAll; + @BindView(R2.id.tv_price) + TypeFaceTextView mTvPrice; + @BindView(R2.id.tv_confirm) + TypeFaceTextView mTvConfirm; + private List mCarDatas = new ArrayList<>(); private List mDatas; - private GoodsCarAdapter mAdapter; + private CarGoodsAdapter mAdapter; @Override protected int setLayoutId() { @@ -45,12 +58,102 @@ public class ShopCarActivity extends BaseActivity { ButterKnife.bind(this); mTvBaseTitle.setText("购物车"); mDatas = new ArrayList<>(); - mAdapter = new GoodsCarAdapter(mActivity, mDatas); + mAdapter = new CarGoodsAdapter(mActivity, mCarDatas); mRlvCar.setLayoutManager(new LinearLayoutManager(mActivity)); mRlvCar.setAdapter(mAdapter); + mAdapter.addClick((b, i) -> new AlertDialog.Builder(mActivity) + .setTitle("提示") + .setMessage("确定要删除该商品吗?") + .setPositiveButton("确定", (dialog, which) -> { + dialog.dismiss(); + mCarDatas.remove(b); + toSaveLocalData(); + mAdapter.setData(mCarDatas); + countPrice(); + if (mCarDatas.size() <= 0) { + refreshView(STATE_LOAD_EMPTY); + mTvErrorHint.setText("购物车暂无数据"); + } + }) + .setNegativeButton("取消", (dialog, which) -> dialog.dismiss()) + .create() + .show()); + //点击条目 + mAdapter.addItemC((bean, i) -> { + bean.setCheck(!bean.isCheck()); + mAdapter.setData(mCarDatas); + countPrice(); + }); + //全选 + mCbAll.setOnCheckedChangeListener((buttonView, isChecked) -> { + double totalPrice = 0.00; + for (int i = 0; i < mCarDatas.size(); i++) { + ShopGoodsDetailBean bean = mCarDatas.get(i); + if (buttonView.isPressed()) { + bean.setCheck(isChecked); + } else { + if (!bean.isCheck()) { + bean.setCheck(isChecked); + } + } + double v = bean.getGoodsPrice() * bean.getCarAmount(); + totalPrice += v; + } + if (isChecked) { + setPrice(totalPrice); + } else { + setPrice(0.00); + } + mAdapter.setData(mCarDatas); + }); + + mAdapter.addCheckListener((b, j, check) -> { + //刷新价格 + countPrice(); + }); parserShopCar(); + mTvConfirm.setOnClickListener(v -> doSaveOrder()); } + /** + * 提交订单 + */ + private void doSaveOrder() { + + } + + + private void countPrice() { + double totalPrice = 0.00; + boolean isAll = true; + for (int i = 0; i < mCarDatas.size(); i++) { + ShopGoodsDetailBean bean = mCarDatas.get(i); + if (bean.isCheck()) { + totalPrice += (bean.getGoodsPrice() * bean.getCarAmount()); + } + if (!bean.isCheck()) { + isAll = false; + } + } + mCbAll.setChecked(isAll); + setPrice(totalPrice); + } + + private void toSaveLocalData() { + Gson gson = new Gson(); + String s = gson.toJson(mCarDatas); + UserLgUtils.setShopCar(s); + } + + /** + * 设置订单价格 + */ + private void setPrice(double price) { + SpannableString spannableString = new SpannableString("¥" + price); + RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(0.6f); + spannableString.setSpan(relativeSizeSpan, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + mTvPrice.setText(spannableString); + } private void parserShopCar() { try { @@ -60,7 +163,15 @@ public class ShopCarActivity extends BaseActivity { Type type = new TypeToken>() { }.getType(); mCarDatas = gson.fromJson(shopCar, type); - parserDatas(); + LogUtils.e("购物车数据===" + mCarDatas); + if (mCarDatas != null && mCarDatas.size() > 0) { + countPrice(); + mAdapter.setData(mCarDatas); + refreshView(STATE_LOAD_SUCCESS); + } else { + refreshView(STATE_LOAD_EMPTY); + mTvErrorHint.setText("购物车暂无数据"); + } } else { refreshView(STATE_LOAD_EMPTY); mTvErrorHint.setText("购物车暂无数据"); @@ -70,25 +181,41 @@ public class ShopCarActivity extends BaseActivity { } } - /** - * 构建数据 - */ - private void parserDatas() { - mDatas = new ArrayList<>(); - for (int i = 0; i < mCarDatas.size(); i++) { - ShopGoodsDetailBean bean = mCarDatas.get(i); - CustomCarBean b = new CustomCarBean(); - b.setShopId(bean.getShopId()); - b.setShopName(bean.getShopName()); - b.setGoods(new ArrayList<>()); - for (int j = 0; j < mCarDatas.size(); j++) { - if (bean.getShopId().equals(mCarDatas.get(j).getShopId())) { - b.getGoods().add(mCarDatas.get(j)); - } - } - mDatas.add(b); - } - mAdapter.setData(mDatas); - refreshView(STATE_LOAD_SUCCESS); + @Override + protected void onDestroy() { + super.onDestroy(); + toSaveLocalData(); } + // /** +// * 构建数据 +// */ +// private void parserDatas() { +// mDatas = new ArrayList<>(); +// for (int i = 0; i < mCarDatas.size(); i++) { +// ShopGoodsDetailBean bean = mCarDatas.get(i); +// int pos = -1; +// boolean flag = false; +// for (int j = 0; j < mDatas.size(); j++) { +// CustomCarBean b = mDatas.get(j); +// if (b.getShopId().equals(bean.getShopId())) { +// flag = true; +// pos = j; +// break; +// } +// } +// if (flag) { +// mDatas.get(pos).getGoods().add(bean); +// } else { +// CustomCarBean b = new CustomCarBean(); +// b.setShopId(bean.getShopId()); +// b.setShopName(bean.getShopName()); +// b.setGoods(new ArrayList<>()); +// b.getGoods().add(bean); +// mDatas.add(b); +// } +// } +// mAdapter.setData(mDatas); +// refreshView(STATE_LOAD_SUCCESS); +// } + } \ No newline at end of file diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/CarGoodsAdapter.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/CarGoodsAdapter.java index d0b0758..f60283f 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/CarGoodsAdapter.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/CarGoodsAdapter.java @@ -46,19 +46,64 @@ public class CarGoodsAdapter extends BaseRecyclerAdapter 1) { + bean.setCarAmount(bean.getCarAmount() - 1); + notifyDataSetChanged(); + mOnCheckListener.onClick(bean, i, bean.isCheck()); + } } }); + if (mOnClickLis != null) { + h.mIvDelItem.setOnClickListener(v -> mOnClickLis.onClick(bean, i)); + } + h.mCbCheck.setChecked(bean.isCheck()); +// h.mCbCheck.setOnCheckedChangeListener((buttonView, isChecked) -> { +// mOnCheckListener.onClick(bean, i, isChecked); +// }); + h.mLlItem.setOnClickListener(v ->mOnItemC.onItemC(bean, i)); } + + public OnItemC mOnItemC; + + public void addItemC(OnItemC c) { + this.mOnItemC = c; + } + + public interface OnItemC { + void onItemC(ShopGoodsDetailBean bean, int i); + } + + protected OnCheckListener mOnCheckListener; + + public void addCheckListener(OnCheckListener clickLis) { + this.mOnCheckListener = clickLis; + } + + public interface OnCheckListener { + void onClick(ShopGoodsDetailBean b, int i, boolean check); + } + + + protected OnClickLis mOnClickLis; + + public void addClick(OnClickLis clickLis) { + this.mOnClickLis = clickLis; + } + + public interface OnClickLis { + void onClick(ShopGoodsDetailBean b, int i); + } + } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/GoodsCarAdapter.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/GoodsCarAdapter.java index c0fae06..1d5814c 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/GoodsCarAdapter.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/adapter/GoodsCarAdapter.java @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.sucstepsoft.cm_utils.core.widget.base.BaseRecyclerAdapter; import com.tengshisoft.moduleshop.R; import com.tenlionsoft.moduleshop.beans.CustomCarBean; +import com.tenlionsoft.moduleshop.beans.ShopGoodsDetailBean; import com.tenlionsoft.moduleshop.holder.GoodsCarHolder; import java.util.List; @@ -36,5 +37,16 @@ public class GoodsCarAdapter extends BaseRecyclerAdapter mOnClickLis.onClick(shopGoodsDetailBean, i,p)); + } + + protected OnClickLis mOnClickLis; + + public void addClick(OnClickLis clickLis) { + this.mOnClickLis = clickLis; + } + + public interface OnClickLis { + void onClick(ShopGoodsDetailBean b, int p,int i); } } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/GoodsStandardBean.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/GoodsStandardBean.java index 930126b..ea967b4 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/GoodsStandardBean.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/GoodsStandardBean.java @@ -15,26 +15,9 @@ public class GoodsStandardBean { private int goodsItemTotal; private String goodsItemUnit; private double goodsItemUnitPrice; - private int goodsItemWeight; + private double goodsItemWeight; private int isDelete; private String modifier; - private boolean isCheck; - - public String getModifier() { - return modifier; - } - - public void setModifier(String modifier) { - this.modifier = modifier; - } - - public boolean isCheck() { - return isCheck; - } - - public void setCheck(boolean check) { - isCheck = check; - } public String getCreator() { return creator; @@ -140,11 +123,11 @@ public class GoodsStandardBean { this.goodsItemUnitPrice = goodsItemUnitPrice; } - public int getGoodsItemWeight() { + public double getGoodsItemWeight() { return goodsItemWeight; } - public void setGoodsItemWeight(int goodsItemWeight) { + public void setGoodsItemWeight(double goodsItemWeight) { this.goodsItemWeight = goodsItemWeight; } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/ShopGoodsDetailBean.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/ShopGoodsDetailBean.java index 137dbc0..a8d7449 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/ShopGoodsDetailBean.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/beans/ShopGoodsDetailBean.java @@ -1,8 +1,10 @@ package com.tenlionsoft.moduleshop.beans; +import com.google.gson.Gson; + import java.util.List; -public class ShopGoodsDetailBean { +public class ShopGoodsDetailBean implements Cloneable { private String categoryId; private String categoryName; @@ -36,13 +38,48 @@ public class ShopGoodsDetailBean { //自定义 购物车中数量与商品单价 private int carAmount; - private String goodsPrice; + private double goodsPrice; + private String goodsStandarId; + private String goodsStandarName; + private boolean isCheck; - public String getGoodsPrice() { + public boolean isCheck() { + return isCheck; + } + + public void setCheck(boolean check) { + isCheck = check; + } + + public String getModifier() { + return modifier; + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public String getGoodsStandarId() { + return goodsStandarId; + } + + public void setGoodsStandarId(String goodsStandarId) { + this.goodsStandarId = goodsStandarId; + } + + public String getGoodsStandarName() { + return goodsStandarName; + } + + public void setGoodsStandarName(String goodsStandarName) { + this.goodsStandarName = goodsStandarName; + } + + public double getGoodsPrice() { return goodsPrice; } - public void setGoodsPrice(String goodsPrice) { + public void setGoodsPrice(double goodsPrice) { this.goodsPrice = goodsPrice; } @@ -378,4 +415,20 @@ public class ShopGoodsDetailBean { this.shopGoodsParameterId = shopGoodsParameterId; } } + + @Override + public String toString() { + return new Gson().toJson(this); + } + + @Override + public ShopGoodsDetailBean clone() { + + try { + return (ShopGoodsDetailBean) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } + } } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/fragments/ShopSortFragment.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/fragments/ShopSortFragment.java index b89ee5b..8f7d383 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/fragments/ShopSortFragment.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/fragments/ShopSortFragment.java @@ -41,6 +41,8 @@ public class ShopSortFragment extends BaseFragment { RecyclerView mRlvOneSort; @BindView(R2.id.rlv_sort) RecyclerView mRlvSort; + @BindView(R2.id.ll_car) + LinearLayout mLlCar; private Unbinder mBind; private List mDatas; private List mSubListBeans = new ArrayList<>(); @@ -57,6 +59,17 @@ public class ShopSortFragment extends BaseFragment { mBind = ButterKnife.bind(this, dataView); setStateView(STATE_LOAD); mDatas = new ArrayList<>(); + mLlCar.setOnClickListener(v -> { + if (isLogin()) { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_SHOP_ACTIVITY_SHOP_CAR) + .navigation(); + } else { + ARouter.getInstance() + .build(PathConfig.PATH_MODULE_MAIN_LOGIN) + .navigation(); + } + }); mOneAdapter = new ShopSortOneAdapter(mActivity, mDatas); mRlvOneSort.setLayoutManager(new LinearLayoutManager(mActivity)); mRlvOneSort.setAdapter(mOneAdapter); diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/holder/CarGoodsHolder.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/holder/CarGoodsHolder.java index db36c00..f910e04 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/holder/CarGoodsHolder.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/holder/CarGoodsHolder.java @@ -1,7 +1,9 @@ package com.tenlionsoft.moduleshop.holder; import android.view.View; +import android.widget.CheckBox; import android.widget.ImageView; +import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -21,6 +23,10 @@ public class CarGoodsHolder extends RecyclerView.ViewHolder { public TypeFaceTextView mTvEvaluate; public TypeFaceTextView mTvFreight; public AddOrDelView mAodView; + public ImageView mIvDelItem; + public TypeFaceTextView mTvGoodsStandard; + public CheckBox mCbCheck; + public LinearLayout mLlItem; public CarGoodsHolder(@NonNull View itemView) { super(itemView); @@ -31,5 +37,9 @@ public class CarGoodsHolder extends RecyclerView.ViewHolder { mTvEvaluate = itemView.findViewById(R.id.tv_goods_evaluate); mTvFreight = itemView.findViewById(R.id.tv_goods_freight); mAodView = itemView.findViewById(R.id.aod_control); + mIvDelItem = itemView.findViewById(R.id.iv_del_item); + mTvGoodsStandard = itemView.findViewById(R.id.tv_goods_standard); + mCbCheck = itemView.findViewById(R.id.cb_check); + mLlItem = itemView.findViewById(R.id.ll_item); } } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/net/ShopApi.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/net/ShopApi.java index aa67b07..4db5f76 100644 --- a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/net/ShopApi.java +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/net/ShopApi.java @@ -1,5 +1,6 @@ package com.tenlionsoft.moduleshop.net; +import com.sucstepsoft.cm_utils.core.beans.BaseSuccessBean; import com.tenlionsoft.moduleshop.beans.GoodsListBean; import com.tenlionsoft.moduleshop.beans.GoodsStandardBean; import com.tenlionsoft.moduleshop.beans.ShopGoodsDetailBean; @@ -8,8 +9,12 @@ import com.tenlionsoft.moduleshop.beans.ShopSortListBean; import java.util.List; import io.reactivex.Observable; +import okhttp3.RequestBody; +import retrofit2.http.Body; import retrofit2.http.GET; +import retrofit2.http.Header; import retrofit2.http.Headers; +import retrofit2.http.POST; import retrofit2.http.Path; import retrofit2.http.Query; @@ -62,4 +67,12 @@ public interface ShopApi { @Headers({"base_url_name:shop", "Content-Type:application/json", "Accept:application/json"}) @GET("app/shopgoodsitem/listrelease/{goodsId}") Observable> getStandardListByGoodsId(@Path("goodsId") String goodsId); + + + /** + * 提交订单 + */ + @Headers({"base_url_name:shop", "Content-Type:application/json", "Accept:application/json"}) + @POST("app/order/savebycart") + Observable doSaveOrder(@Body RequestBody goods, @Header("token") String token); } diff --git a/moduleshop/src/main/java/com/tenlionsoft/moduleshop/utils/TreeUtils.java b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/utils/TreeUtils.java new file mode 100644 index 0000000..73af8a9 --- /dev/null +++ b/moduleshop/src/main/java/com/tenlionsoft/moduleshop/utils/TreeUtils.java @@ -0,0 +1,143 @@ +package com.tenlionsoft.moduleshop.utils; + +import com.sucstepsoft.cm_utils.utils.StringUtils; + +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class TreeUtils { + + // 默认 id 字段名 + private static final String ID_DEFAULT_FIELD = "shopId"; + // 默认 父级字段名 + private static final String PARENT_DEFAULT_FIELD = "shopId"; + // 默认 子级字段名 + private static final String CHILDREN_DEFAULT_FIELD = "shopId"; + + /** + * 构建树状结构 + * + * @param list 原数据集 + * @param parentId 父级字段名 + * @param id id字段名 + * @param children 子级字段名 + * @param clazz 数据实体 + * @param 泛型 + * @return 树状结构 + */ + public static List buildTree(List list, String parentId, String id, String children, + @NotNull Class clazz) { + if (list == null) { + return null; + } + // 如果被依赖字段名称为空则默认为id + if (StringUtils.isEmpty(id)) { + id = ID_DEFAULT_FIELD; + } + // 如果依赖字段为空则默认为 parentId + if (StringUtils.isEmpty(parentId)) { + parentId = PARENT_DEFAULT_FIELD; + } + // 如果子节点集合属性名称为空则默认为children + if (StringUtils.isEmpty(children)) { + children = CHILDREN_DEFAULT_FIELD; + } + + try { + // 获取 id 字段, 从当前对象或其父类 + Field idField; + try { + idField = clazz.getDeclaredField(id); + } catch (NoSuchFieldException e1) { + idField = clazz.getSuperclass().getDeclaredField(id); + } + + // 获取 parentId 字段, 从当前对象或其父类 + Field parentField; + try { + parentField = clazz.getDeclaredField(parentId); + } catch (NoSuchFieldException e1) { + parentField = clazz.getSuperclass().getDeclaredField(parentId); + } + + // 获取 children 字段, 从当前对象或其父类 + Field childrenField; + try { + childrenField = clazz.getDeclaredField(children); + } catch (NoSuchFieldException e1) { + childrenField = clazz.getSuperclass().getDeclaredField(children); + } + + // 设置为可访问 + idField.setAccessible(true); + parentField.setAccessible(true); + childrenField.setAccessible(true); + return buildTree(list, parentField, idField, childrenField); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 构建树状结构 + * + * @param list 数据集 + * @param parentField 父级ID字段 + * @param idField id字段 + * @param childrenField 子集字段 + * @param 数据类型 + * @return 树状结构 + * @throws IllegalAccessException 异常 + */ + public static List buildTree(List list, Field parentField, Field idField, Field childrenField) throws IllegalAccessException { + List result = new ArrayList<>(); + + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + T root = iterator.next(); + iterator.remove(); + childrenField.set(root, findChild(root, list, parentField, idField, childrenField)); + // 刷新 iterator + iterator = list.iterator(); + result.add(root); + } + return result; + } + + /** + * 查找子集 + * + * @param root 节点 + * @param list 所有集合 + * @param parentField 父级字段 + * @param idField id字段 + * @param childrenField 子级字段 + * @param + * @return 子级集合 + * @throws IllegalAccessException 异常信息 + */ + private static List findChild(T root, List list, Field parentField, Field idField, Field childrenField) + throws IllegalAccessException { + Object id = idField.get(root); + List children = new ArrayList<>(); + + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + T node = iterator.next(); + Object parentId = parentField.get(node); + if (id.equals(parentId)) { + iterator.remove(); + childrenField.set(node, findChild(node, list, parentField, idField, childrenField)); + // 刷新 iterator + iterator = list.iterator(); + children.add(node); + } + } + return children; + } +} diff --git a/moduleshop/src/main/res/layout/activity_goods_list.xml b/moduleshop/src/main/res/layout/activity_goods_list.xml index 6b12c60..0fa9c0c 100644 --- a/moduleshop/src/main/res/layout/activity_goods_list.xml +++ b/moduleshop/src/main/res/layout/activity_goods_list.xml @@ -46,5 +46,32 @@ android:textColor="@color/black" tools:text="加载数据失败" /> + + + + + + + \ No newline at end of file diff --git a/moduleshop/src/main/res/layout/activity_shop_car.xml b/moduleshop/src/main/res/layout/activity_shop_car.xml index 5b1e695..257819d 100644 --- a/moduleshop/src/main/res/layout/activity_shop_car.xml +++ b/moduleshop/src/main/res/layout/activity_shop_car.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + android:layout_height="wrap_content" + android:layout_marginBottom="55dp" /> + + + + + + + + + + + \ No newline at end of file diff --git a/moduleshop/src/main/res/layout/fragment_shop_sort.xml b/moduleshop/src/main/res/layout/fragment_shop_sort.xml index 3e51c18..40aa256 100644 --- a/moduleshop/src/main/res/layout/fragment_shop_sort.xml +++ b/moduleshop/src/main/res/layout/fragment_shop_sort.xml @@ -51,4 +51,31 @@ + + + + + + + \ No newline at end of file diff --git a/moduleshop/src/main/res/layout/item_car_goods.xml b/moduleshop/src/main/res/layout/item_car_goods.xml index 0992fd7..f5f3960 100644 --- a/moduleshop/src/main/res/layout/item_car_goods.xml +++ b/moduleshop/src/main/res/layout/item_car_goods.xml @@ -6,10 +6,20 @@ android:background="@color/white" android:padding="8dp"> + + @@ -20,22 +30,43 @@ android:orientation="vertical" android:paddingLeft="10dp"> - + android:orientation="vertical"> - + + + + + + + + + android:layout_centerVertical="true" + android:src="@drawable/ic_del_tong" />