Android項目實戰:商城APPday03-購物車實現
不否認努力,繼續加油!
學習整理重點、盲區,筆記如下:乾乾巴巴,麻麻賴賴,一點都不圓潤……
源碼 已上傳至集哈:ShoppingMall.
https://github.com/SmileAlfred/ShoppingMall
day03
內容
1. 購物車存儲器類
-
存儲類
public class CartStorage { public static final String JSON_CART = "json_cart"; private Context context; //優化過的HashMap集合 private SparseArray<GoodsBean> datas; private static CartStoragecartProvider; private CartProvider(Context context) { this.context = context; datas = new SparseArray<>(100); listToSparse(); } public static CartStorage getInstance() { if (CartStorage == null) { CartStorage = new CartProvider(MyAppliction.getContext()); } return cartProvider; } private void listToSparse() { List<GoodsBean> carts = getAllData(); //放到 sparseArry 中 if (carts != null && carts.size() > 0) { for (int i = 0; i < carts.size(); i++) { GoodsBean goodsBean = carts.get(i); datas.put(Integer.parseInt(goodsBean.getProduct_id()), goodsBean); } } } private List<GoodsBean> parsesToList() { List<GoodsBean> carts = new ArrayList<>(); if (datas != null && datas.size() > 0) { for (int i = 0; i < datas.size(); i++) { GoodsBean shoppingCart = datas.valueAt(i); carts.add(shoppingCart); } } return carts; } public List<GoodsBean> getAllData() { return getDataFromLocal(); } //本地獲取json數據,並且通過Gson解析成list列表數據 public List<GoodsBean> getDataFromLocal() { List<GoodsBean> carts = new ArrayList<>(); //從本地獲取緩存數據 String savaJson = CacheUtils.getString(context, JSON_CART); if (!TextUtils.isEmpty(savaJson)) { //把數據轉換成列表 carts = new Gson().fromJson(savaJson, new TypeToken<List<GoodsBean>>() { }.getType()); } return carts; } public void addData(GoodsBean cart) { GoodsBean tempCart = datas.get(Integer.parseInt(cart.getProduct_id())); if (tempCart != null) { tempCart.setNumber(tempCart.getNumber() + 1); } else { tempCart = cart; tempCart.setNumber(1); } datas.put(Integer.parseInt(tempCart.getProduct_id()), tempCart); commit(); } public void deleteData(GoodsBean cart) { datas.delete(Integer.parseInt(cart.getProduct_id())); commit(); } public void updataData(GoodsBean cart) { datas.put(Integer.parseInt(cart.getProduct_id()), cart); commit(); } //保存數據 private void commit() { //把 parseArray 轉換成list List<GoodsBean> carts = parsesToList(); //把轉換成String String json = new Gson().toJson(carts); CacheUtils.putString(context, JSON_CART, json); } }
-
添加依賴:
implementation 'com.google.code.gson:gson:2.8.6'
; -
緩存文本工具類
public class CacheUtils { public static String getString(Context context, String key) { SharedPreferences sp = context.getSharedPreferences("atguigu",Context.MODE_PRIVATE); return sp.getString(key,""); } public static void saveString(Context context, String key,String value) { SharedPreferences sp = context.getSharedPreferences("atguigu",Context.MODE_PRIVATE); sp.edit().putString(key,value).commit(); } }
-
在 GoodsInfoActivity 添加商品
if (v == btnGoodInfoAddcart) { //添加購物車 cartProvider.addData(goods_bean); Toast.makeText(GoodsInfoActivity.this, "添加購物車", Toast.LENGTH_SHORT).show(); }
2. 購物車展示頁面
-
頁面分析:
最外邊是 LinearLayout 1:相對佈局(標題) 2:View 分割線 3:FrameLayou 1:LinearLayout 1:RecyclerView 2:LinearLayout(結算) 3:LinearLayout(刪除) 2:空車顯示佈局 empty_cart.xml
3. 購物車數據的展現
- item 佈局
- ShoppingCartFragment 初始化佈局
- 適配器 ShopCartAdapter
4. 購物車商品選中和商品總價計算
-
商品總價格計算
public void showTotalPrice() { tvShopcartTotal.setText("合計:" + getTotalPrice()); } // 計算總價格 public double getTotalPrice() { double totalPrice = 0.0; if (datas != null && datas.size() > 0) { for (int i = 0; i < datas.size(); i++) { GoodsBean goodsBean = datas.get(i); if(goodsBean.isSelected()){ totalPrice = totalPrice + Double.valueOf(goodsBean.getNumber()) * Double.valueOf(goodsBean.getCover_price()); } } } return totalPrice; }
-
增加商品或者減少商品的時候計算總價格
holder.addSubView.setValue(goodsBean.getNumber()); holder.addSubView.setOnNumberChangeListener(new AddSubView.OnNumberChangeListener() { @Override public void onNumberChange(int value) { goodsBean.setNumber(value); CartStorage.getInstance().updateData(goodsBean); //刷新適配器 notifyItemChanged(position); showTotalPrice(); } });
-
設置點擊某一條 item
public interface OnItemClickListener{ // 當點擊某條的時候被回調 public void onItemClick(int position); } private OnItemClickListener onItemClickListener; // 設置item的監聽 public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { GoodsBean goodsBean = datas.get(position); goodsBean.setSelected(!goodsBean.isSelected()); notifyItemChanged(position); checkAll(); showTotalPrice(); } });
-
全選和反選
public void checkAll() { if (datas != null && datas.size() > 0) { for (int i = 0; i < datas.size(); i++) { if (datas.get(i).isChildSelected()) { checkboxAll.setChecked(false); cb_all.setChecked(false); return; } else { checkboxAll.setChecked(true); cb_all.setChecked(true); } } } } //CheckBox的點擊事件 checkboxAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //1.得到狀態 boolean isCheck = checkboxAll.isChecked(); //2.根據狀態設置全選和非全選 checkAll_none(isCheck); //3.計算總價格 showTotalPrice(); } }); //設置全選和非全選 public void checkAll_none(boolean isCheck) { if (datas != null && datas.size() > 0) { for (int i = 0; i < datas.size(); i++) { GoodsBean goodsBean = datas.get(i); goodsBean.setSelected(isCheck); notifyItemChanged(i); } } else { checkboxAll.setChecked(false); } }
5. 購物車編輯實現
-
設置點擊事件和定義狀態;點擊編輯按鈕,調出刪除和收藏按鈕;
//編輯狀態、完成狀態 private static final int ACTION_EDIT = 1; private static final int ACTION_COMPLETE = 2; //設置默認的編輯狀態 tvShopcartEdit.setTag(ACTION_EDIT); tvShopcartEdit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int action = (int) v.getTag(); if (action == ACTION_EDIT) { //切換爲完成狀態 showDelete(); } else { //切換成編輯狀態 hideDelete(); } } });
-
在適配器中刪除選中的 item
public void deleteData() { if (datas != null && datas.size() > 0) { for (int i = 0; i < datas.size(); i++) { GoodsBean goodsBean = datas.get(i); if (goodsBean.isSelected()) { datas.remove(goodsBean); CartStorage.getInstance().deleteData(goodsBean); notifyItemRemoved(i); i--; } } } }
盲區
- 聲明:本博客根據尚硅谷項目實戰: 硅谷商城.學習整理;
其他實戰
商城
- day01
第一節學習筆記:鏈接: 商城APP01—框架搭建. - day02
第二節學習筆記:鏈接: 商城APP02—主頁實現.
新聞
Android項目實戰——新聞APP 學習筆記:鏈接: 新聞APP.