Android購物車實現—商城APP03


不否認努力,繼續加油!

學習整理重點、盲區,筆記如下:乾乾巴巴,麻麻賴賴,一點都不圓潤……
源碼 已上傳至集哈:ShoppingMall.
https://github.com/SmileAlfred/ShoppingMall

day03

內容

1. 購物車存儲器類

  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);
        }
    }
    
  2. 添加依賴:implementation 'com.google.code.gson:gson:2.8.6'

  3. 緩存文本工具類

    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();
        }
    }
    
  4. 在 GoodsInfoActivity 添加商品

    if (v == btnGoodInfoAddcart) { 
    	//添加購物車 
    	cartProvider.addData(goods_bean); 
    	Toast.makeText(GoodsInfoActivity.this, "添加購物車", Toast.LENGTH_SHORT).show(); 
    }
    

2. 購物車展示頁面

  1. 頁面分析:

    最外邊是 LinearLayout
    	1:相對佈局(標題)
    	2:View 分割線
    	3:FrameLayou
    		1:LinearLayout
    			1:RecyclerView
    			2:LinearLayout(結算)
    			3:LinearLayout(刪除)
    		2:空車顯示佈局 empty_cart.xml
    

在這裏插入圖片描述在這裏插入圖片描述

3. 購物車數據的展現

  1. item 佈局
  2. ShoppingCartFragment 初始化佈局
  3. 適配器 ShopCartAdapter

4. 購物車商品選中和商品總價計算

  1. 商品總價格計算

    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;
    }
    
  2. 增加商品或者減少商品的時候計算總價格

    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();
        }
    });
    
  3. 設置點擊某一條 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();
        }
    });
    
  4. 全選和反選

     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. 購物車編輯實現

  1. 設置點擊事件和定義狀態;點擊編輯按鈕,調出刪除和收藏按鈕;

    //編輯狀態、完成狀態
    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();
            }
        }
    });
    
  2. 在適配器中刪除選中的 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--;
                }
            }
        }
    }
    

盲區

  1. 聲明:本博客根據尚硅谷項目實戰: 硅谷商城.學習整理;

其他實戰

商城

  1. day01
    第一節學習筆記:鏈接: 商城APP01—框架搭建.
  2. day02
    第二節學習筆記:鏈接: 商城APP02—主頁實現.

新聞

Android項目實戰——新聞APP 學習筆記:鏈接: 新聞APP.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章