主要是在内存创建个名叫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;
}