学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……
源码 已上传至集哈:ShoppingMall.
https://github.com/SmileAlfred/ShoppingMall
存储类
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();
}
页面分析:
最外边是 LinearLayout
1:相对布局(标题)
2:View 分割线
3:FrameLayou
1:LinearLayout
1:RecyclerView
2:LinearLayout(结算)
3:LinearLayout(删除)
2:空车显示布局 empty_cart.xml
商品总价格计算
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);
}
}
设置点击事件和定义状态;点击编辑按钮,调出删除和收藏按钮;
//编辑状态、完成状态
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--;
}
}
}
}
Android项目实战——新闻APP 学习笔记:链接: 新闻APP.