總結下安卓實現購物車功能原理
阿新 • • 發佈:2019-02-09
主要是在記憶體建立個名叫SparseArray的物件,算是升級版的Hashmap,在效能上提高了優化,利用key-value儲存商品Bean。
首先我們需要個操控購物車的工具類
這裡叫做CartUtils吧,必須是單例的(畢竟一個使用者一個購物車嘛),我們在該類的構造方法(有初始化作用)裡初始化下sparseArray
Step.1
SparseArray data=new SparseArray<>(100);
這樣就有了儲存商品的資料結構,接下來,我們需要思考將商品存入伺服器還是快取(這裡說的快取就是sharedpreferences)
這裡我就先選擇本地快取了。
Step.2
需要從本地快取中讀取
因為本地存入的是json資料,json資料如何轉換成sparseArray,直接轉換是不可能的,但是可以間接轉換,我們就需要箇中間人物件
這個物件就是Arraylist
建立個方法 listToSparse();
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); } } }
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; }
這裡用到了Gson將Json字串轉化為List
然後分別遍歷list加入sparseArray。
提供三個方法,對外進行呼叫
addData() deleteData() updateData()
public void addData(GoodsBean cart) {
//新增資料
GoodsBean tempCart = datas.get(Integer.parseInt(cart.getProduct_id()));
if (tempCart != null) {
tempCart.setNumber(tempCart.getNumber() + cart.getNumber());
} else {
tempCart = cart;
tempCart.setNumber(1);
}
datas.put(Integer.parseInt(tempCart.getProduct_id()), tempCart);
//儲存資料
commit();
}
這裡的commit就是將sparseArray存入本地快取
private void commit() {
//把parseArray轉換成list
List<GoodsBean> carts = sparsesToList();
//把轉換成String
String json = new Gson().toJson(carts);
// 儲存
CacheUtils.putString(context, JSON_CART, json);
}
private List<GoodsBean> sparsesToList() {
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;
}