内容很糙,多选有很多bug,拖拉机修复
依赖
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.5.0'
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.google.code.gson:gson:2.2.4'
http
HttpConfig
/**
* author:Created by LiQiang on 2018-01-10.
* 公共参数:source 来源字段 String类型 (通过自定义拦截器封装,否则判0分)
*
1.商品详情接口
https://www.zhaoapi.cn/product/getProductDetail
请求参数说明:
pid 商品id字段 String类型 必传
返回字段说明:
bargainPrice 优惠价字段 double类型
title 商品名称字段 String类型
price 原价字段
images 图片列表字段 String类型(注意多张图片用|分割,需要分离出图片url,取第一张图片显示即可)
2.加入购物车接口
https://www.zhaoapi.cn/product/addCart
请求参数说明:
uid 用户id字段 String类型 必传
pid 商品id字段 String类型 必传
返回字段说明:
{"msg":"加购成功","code":"0"}
3.获取购物车列表接口
https://www.zhaoapi.cn/product/getCarts
请求参数说明:
uid 用户id字段 String类型 必传
返回字段说明:
见返回json串
sellerName 商家名称
sellerid 商家id
商家包含的商品,返回字段说明,同商品详情返回参数说明。
4.更新购物车
接口地址:http://120.27.23.105/product/updateCarts?uid=71&sellerid=1&pid=1&selected=0&num=10
返回格式:json
请求方式:get/post
接口备注:更新购物车
请求参数说明:
名称 类型 必填 说明
uid string 是 用户id
sellerid string 是 商户id
pid string 是 商品id
num string 是 商品数量
selected string 是 是否选中
5.删除购物车(新增)
接口地址:https://www.zhaoapi.cn/product/deleteCart?uid=72&pid=1
返回格式:json
请求方式:get/post
接口备注:删除购物车
请求参数说明:
名称 类型 必填 说明
uid string 是 用户id
pid string 是 商品id
token String 是 用户令牌
返回参数说明
*/
public class HttpConfig {
public static String url_detail = "https://www.zhaoapi.cn/product/getProductDetail";
public static String url_add = "https://www.zhaoapi.cn/product/addCart";
public static String url_carts = "https://www.zhaoapi.cn/product/getCarts";
public static String url_upadtecarts = "http://120.27.23.105/product/updateCarts";
public static String url_deletecarts = "https://www.zhaoapi.cn/product/deleteCart";
}
OkHttpUtils
public class OKHttpUtils {
private static OKHttpUtils okHttpUtils = null;
//单例
public static OKHttpUtils getInstance() {
if (okHttpUtils == null) {
okHttpUtils = new OKHttpUtils();
}
return okHttpUtils;
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int w = msg.what;
switch (w) {
case 0://失败
String error = (String) msg.obj;
Log.d(TAG, "handleMessage:++++++++++-------e " + error);
onLoadListener.loadError(error);
break;
case 1://成功
String json = (String) msg.obj;
Log.d(TAG, "handleMessage:+++++++++-----------s " + json);
onLoadListener.loadSuccess(json);
break;
}
}
};
private OnLoadListener onLoadListener;
//get
public void okGet(String url) {
OkHttpClient okHttpClient = new OkHttpClient();
Request build = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = handler.obtainMessage();
message.what = 0;
message.obj = e.getMessage();
handler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = handler.obtainMessage();
message.what = 1;
message.obj = response.body().string();
handler.sendMessage(message);
}
});
}
//post
public void okPost(String url, Map<String, Object> map) {
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new MyInter()).build();
//创建formbody
FormBody.Builder builder = new FormBody.Builder();
Set<String> keySet = map.keySet();
for (String key : keySet) {
Object value = map.get(key);
builder.add(key, String.valueOf(value));
}
FormBody build1 = builder.build();
Request build = new Request.Builder().url(url).post(build1).build();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Message message = handler.obtainMessage();
message.what = 0;
message.obj = e.getMessage();
handler.sendMessage(message);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = handler.obtainMessage();
message.what = 1;
message.obj = response.body().string();
handler.sendMessage(message);
}
});
}
class MyInter implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取原来的body
Request request = chain.request();
RequestBody body = request.body();
if (body instanceof FormBody) {
FormBody.Builder builder = new FormBody.Builder();
for (int i = 0; i < ((FormBody) body).size(); i++) {
String name = ((FormBody) body).name(i);
String value = ((FormBody) body).value(i);
//放入新的
builder.add(name, value);
}
builder.add("source", "android");
FormBody formBody = builder.build();
Request request1 = request.newBuilder().post(formBody).build();
Response proceed = chain.proceed(request1);
return proceed;
}
return null;
}
}
public void setOnLoadListener(OnLoadListener onLoadListener) {
this.onLoadListener = onLoadListener;
}
}
Model
IModel
public interface IModel {
//得到详情页面数据
void getDetailData(String url, Map<String, Object> map, OnDetailLoadListener onDetailLoadListener);
//计算总价
double jisuanNum(CartBean cartBean);
}
ModelImpl
public class ModelImpl implements IModel {
@Override
public void getDetailData(String url, Map<String, Object> map, final OnDetailLoadListener onDetailLoadListener) {
//加载okhttp
OKHttpUtils okHttpUtils = OKHttpUtils.getInstance();
okHttpUtils.okPost(url, map);
okHttpUtils.setOnLoadListener(new OnLoadListener() {
@Override
public void loadSuccess(String json) {
Log.d(TAG, "loadSuccess: "+json);
onDetailLoadListener.detailLoadSuccess(json);
}
@Override
public void loadError(String error) {
onDetailLoadListener.detailLoadError(error);
}
});
}
@Override
public double jisuanNum(CartBean cartBean) {
double num = 0;
List<CartBean.DataBean> data = cartBean.getData();
for (int i = 0; i < data.size(); i++) {
List<CartBean.DataBean.ListBean> list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
CartBean.DataBean.ListBean listBean = list.get(j);
if (listBean.isChildIsSelect()) {
num+=listBean.getBargainPrice()*(int)listBean.getNum();
}
}
}
return num;
}
}
MAdapter
public class MAdapter extends BaseExpandableListAdapter {
private final CartBean cartBean;
private final List<CartBean.DataBean> data;
private final Context context;
private final ICartView iCartView;
private final IModel iModel;
private PresenterImpl presenter = new PresenterImpl();
public MAdapter(Context context, CartBean cartBean, ICartView iCartView ,IModel iModel) {
this.context = context;
this.cartBean = cartBean;
this.data = cartBean.getData();
this.iCartView = iCartView;
this.iModel = iModel;
}
@Override
public int getGroupCount() {
return data.size();
}
@Override
public int getChildrenCount(int i) {
return data.get(i).getList().size();
}
@Override
public Object getGroup(int i) {
return data.get(i);
}
@Override
public Object getChild(int i, int i1) {
return data.get(i).getList().get(i1);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
GroupViewHolder groupViewHolder = null;
if (view == null) {
view = View.inflate(context, R.layout.group_item, null);
groupViewHolder = new GroupViewHolder();
groupViewHolder.textView = view.findViewById(R.id.tv);
groupViewHolder.checkBox = view.findViewById(R.id.cb);
view.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) view.getTag();
}
groupViewHolder.textView.setText(data.get(i).getSellerName());
groupViewHolder.checkBox.setChecked(data.get(i).isGroupIsSelect());
groupViewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CartBean.DataBean dataBean = data.get(i);
boolean groupIsSelect = dataBean.isGroupIsSelect();
groupIsSelect = !groupIsSelect;
dataBean.setGroupIsSelect(groupIsSelect);
for (int j = 0; j < dataBean.getList().size(); j++) {
dataBean.getList().get(j).setChildIsSelect(groupIsSelect);
}
PresenterImpl presenter = new PresenterImpl();
presenter.showCartNum(new ModelImpl(), cartBean, iCartView);
notifyDataSetChanged();
}
});
return view;
}
@Override
public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
ChildViewHolder childViewHolder = null;
if (view == null) {
view = View.inflate(context, R.layout.child_item, null);
childViewHolder = new ChildViewHolder();
childViewHolder.checkBox = view.findViewById(R.id.child_cb);
childViewHolder.imageView = view.findViewById(R.id.child_img);
childViewHolder.textView_title = view.findViewById(R.id.child_title);
childViewHolder.textView_price = view.findViewById(R.id.child_price);
childViewHolder.child_numdown = view.findViewById(R.id.child_numdown);
childViewHolder.child_num = view.findViewById(R.id.child_num);
childViewHolder.child_numup = view.findViewById(R.id.child_numup);
childViewHolder.child_delete = view.findViewById(R.id.child_delete);
view.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) view.getTag();
}
String images = data.get(i).getList().get(i1).getImages().split(".jpg")[0] + ".jpg";
Glide.with(context).load(images).into(childViewHolder.imageView);
if (data.get(i).getList().get(i1).getSelected() == 1) {
data.get(i).getList().get(i1).setChildIsSelect(true);
}else{
data.get(i).getList().get(i1).setChildIsSelect(false);
}
boolean childIsSelect = data.get(i).getList().get(i1).isChildIsSelect();
childViewHolder.checkBox.setChecked(childIsSelect);
childViewHolder.textView_title.setText(data.get(i).getList().get(i1).getTitle());
childViewHolder.textView_price.setText(data.get(i).getList().get(i1).getBargainPrice() + "");
childViewHolder.child_num.setText((int) data.get(i).getList().get(i1).getNum() + "");
//减
childViewHolder.child_numdown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<CartBean.DataBean.ListBean> list = cartBean.getData().get(i).getList();
CartBean.DataBean.ListBean listBean = list.get(i1);
int v = (int)listBean.getNum() - 1;
if (v < 1) {
v=1;
Toast.makeText(context, "再少就没有了", Toast.LENGTH_SHORT).show();
}
list.get(i1).setNum(v);
presenter.showCartNum(new ModelImpl(), cartBean, iCartView);
presenter.updateCartData_IPresenter(new ModelImpl(),listBean,iCartView);
notifyDataSetChanged();
}
});
//加
childViewHolder.child_numup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<CartBean.DataBean.ListBean> list = cartBean.getData().get(i).getList();
CartBean.DataBean.ListBean listBean = list.get(i1);
int v = (int)listBean.getNum() + 1;
list.get(i1).setNum(v);
presenter.showCartNum(new ModelImpl(), cartBean, iCartView);
presenter.updateCartData_IPresenter(new ModelImpl(),listBean,iCartView);
notifyDataSetChanged();
}
});
//删除
childViewHolder.child_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<CartBean.DataBean.ListBean> list = cartBean.getData().get(i).getList();
CartBean.DataBean.ListBean listBean = list.get(i1);
list.remove(i1);
presenter.deleteCartData_Ipresenter(new ModelImpl(),listBean,iCartView);
notifyDataSetChanged();
}
});
childViewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
private boolean flag;
@Override
public void onClick(View view) {
flag = true;
List<CartBean.DataBean.ListBean> list = cartBean.getData().get(i).getList();
CartBean.DataBean.ListBean listBean = list.get(i1);
boolean childIsSelect = listBean.isChildIsSelect();
childIsSelect = !childIsSelect;
list.get(i1).setChildIsSelect(childIsSelect);
for (int j = 0; j < list.size(); j++) {
if (list.get(j).isChildIsSelect() == false) {
flag = false;
}
cartBean.getData().get(i).setGroupIsSelect(flag);
}
if (childIsSelect) {
listBean.setSelected(1);
}else{
listBean.setSelected(0);
}
presenter.showCartNum(new ModelImpl(), cartBean, iCartView);
presenter.updateCartData_IPresenter(new ModelImpl(),listBean,iCartView);
notifyDataSetChanged();
}
});
presenter.showCartNum(new ModelImpl(), cartBean, iCartView);
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
//优化
class GroupViewHolder {
private CheckBox checkBox;
private TextView textView;
}
class ChildViewHolder {
private CheckBox checkBox;
private ImageView imageView;
private TextView textView_title;
private TextView textView_price;
private Button child_numdown;
private TextView child_num;
private Button child_numup;
private Button child_delete;
}
}
OnDetailLoadListener
public interface OnDetailLoadListener {
void detailLoadSuccess(String json);
void detailLoadError(String error);
}
OnLoadListener
public interface OnLoadListener {
void loadSuccess(String json);
void loadError(String error);
}
View
SplashActivity跳转动画
public class SplashActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
ImageView iv = (ImageView) findViewById(R.id.iv);
DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
int heightPixels = displayMetrics.heightPixels/2+iv.getHeight();
ObjectAnimator translationY = ObjectAnimator.ofFloat(iv, "translationY", 0, heightPixels);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(iv, "scaleX", 2f, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(iv, "scaleY", 2f, 1f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(iv, "alpha", 0, 1f);
ObjectAnimator rotation = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(translationY,scaleX,scaleY,alpha,rotation);
animatorSet.setDuration(3000);
animatorSet.start();
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
startActivity(new Intent(SplashActivity.this,MainActivity.class));
overridePendingTransition(R.anim.enter,R.anim.out);
}
});
}
}
IMainView
public interface IMainView {
//展示详情页面数据
void showDetailData(DetailBean detailBean);
//跳转到购物车
void jumpToCart();
}
MainActivity
public class MainActivity extends AppCompatActivity implements IMainView, View.OnClickListener {
private ImageView main_image;
private TextView main_title;
private TextView main_price;
private TextView main_bargainPrice;
private TextView main_cart;
private TextView main_addCart;
private PresenterImpl presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
presenter = new PresenterImpl();
presenter.showDetailData_IPresenter(this, new ModelImpl());
}
private void initView() {
main_image = (ImageView) findViewById(R.id.main_image);
main_title = (TextView) findViewById(R.id.main_title);
main_price = (TextView) findViewById(R.id.main_price);
main_bargainPrice = (TextView) findViewById(R.id.main_bargainPrice);
main_cart = (TextView) findViewById(R.id.main_cart);
main_addCart = (TextView) findViewById(R.id.main_addCart);
main_cart.setOnClickListener(this);
main_addCart.setOnClickListener(this);
}
@Override
public void showDetailData(DetailBean detailBean) {
DetailBean.DataBean data = detailBean.getData();
String images = data.getImages();
String images2 = images.split(".jpg")[0] + ".jpg";
String title = data.getTitle();
double price = data.getPrice();
double bargainPrice = data.getBargainPrice();
Glide.with(MainActivity.this).load(images2).into(main_image);
main_title.setText(title);
main_price.setText("原价:" + price + "");
//设置删除线
main_price.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
main_bargainPrice.setText("优惠价:" + bargainPrice + "");
}
@Override
public void jumpToCart() {
startActivity(new Intent(this, CartActivity.class));
overridePendingTransition(R.anim.enter,R.anim.out);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.main_cart:
presenter.jumpToCart(this);
break;
case R.id.main_addCart:
break;
}
}
}
ICartView
public interface ICartView {
//展示购物车数据
void showCartData(CartBean cartBean);
//展示金额总计
void showNum(double num);
}
CartActivity
public class CartActivity extends AppCompatActivity implements ICartView, View.OnClickListener {
private static final String TAG = "Tag+++";
private CheckBox cart_allcheck;
private TextView cart_sum;
private ExpandableListView cart_explv;
private CartBean cartBean;
private MAdapter mAdapter;
private CartBean.DataBean.ListBean listBean;
public int selected = 0;
private PresenterImpl presenter = new PresenterImpl();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
initView();
PresenterImpl presenter = new PresenterImpl();
presenter.showCartData_IPresenter(this, new ModelImpl());
}
private void initView() {
cart_allcheck = (CheckBox) findViewById(R.id.cart_allcheck);
cart_allcheck.setOnClickListener(this);
cart_sum = (TextView) findViewById(R.id.cart_sum);
cart_explv = (ExpandableListView) findViewById(R.id.cart_explv);
}
@Override
public void showCartData(CartBean cartBean) {
//把数据提一下
this.cartBean = cartBean;
mAdapter = new MAdapter(CartActivity.this, cartBean, this, new ModelImpl());
cart_explv.setAdapter(mAdapter);
//展开expandablelistview
int groupCount = mAdapter.getGroupCount();
for (int i = 0; i < groupCount; i++) {
cart_explv.expandGroup(i);
}
}
@Override
public void showNum(double num) {
cart_sum.setText("总价:$" + num);
}
int num = 0;
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.cart_allcheck:
List<CartBean.DataBean> data = cartBean.getData();
for (int i = 0; i < data.size(); i++) {
CartBean.DataBean dataBean = data.get(i);
dataBean.setGroupIsSelect(!dataBean.isGroupIsSelect());
List<CartBean.DataBean.ListBean> list = dataBean.getList();
for (int j = 0; j < list.size(); j++) {
listBean = list.get(j);
Log.d(TAG, "onClick: " + list.get(j).isChildIsSelect());
list.get(j).setChildIsSelect(!list.get(j).isChildIsSelect());
if (list.get(j).isChildIsSelect()) {
selected = 1;
} else {
selected = 0;
}
Log.d(TAG, "onClick: " + list.get(j).isChildIsSelect());
list.get(j).setSelected((int) selected);
presenter.updateCartData_IPresenter(new ModelImpl(), listBean, this);
}
}
presenter.showCartNum(new ModelImpl(), cartBean, this);
Log.d(TAG, "onClick:++++++++++++ " + listBean.getSelected() + listBean.getNum());
mAdapter.notifyDataSetChanged();
break;
case 1:
break;
}
}
}
Presenter
IPresenter
public interface IPresenter {
//详情页面数据
void showDetailData_IPresenter(IMainView iMainView, IModel iModel);
//跳转
void jumpToCart(IMainView iMainView);
//购物车数据
void showCartData_IPresenter(ICartView iCartView, IModel iModel);
//展示总金额
void showCartNum(IModel iModel, CartBean cartBean,ICartView iCartView);
//修改购物车数据
void updateCartData_IPresenter(IModel iModel, CartBean.DataBean.ListBean listBean, ICartView iCartView);
//删除购物车数据
void deleteCartData_Ipresenter(IModel iModel, CartBean.DataBean.ListBean listBean, ICartView iCartView);
}
PresenterImpl
public class PresenterImpl implements IPresenter {
@Override
public void showDetailData_IPresenter(final IMainView iMainView, IModel iModel) {
Map<String, Object> map = new HashMap<>();
map.put("pid", "17");
iModel.getDetailData(HttpConfig.url_detail, map, new OnDetailLoadListener() {
@Override
public void detailLoadSuccess(String json) {
Gson gson = new Gson();
DetailBean detailBean = gson.fromJson(json, DetailBean.class);
iMainView.showDetailData(detailBean);
}
@Override
public void detailLoadError(String error) {
Log.d(TAG, "detailLoadError: 失败+++++++++++++++++++++++");
}
});
}
@Override
public void jumpToCart(IMainView iMainView) {
iMainView.jumpToCart();
}
@Override
public void showCartData_IPresenter(final ICartView iCartView, IModel iModel) {
Map<String, Object> map = new HashMap<>();
map.put("uid", "71");
iModel.getDetailData(HttpConfig.url_carts, map, new OnDetailLoadListener() {
@Override
public void detailLoadSuccess(String json) {
Gson gson = new Gson();
CartBean cartBean = gson.fromJson(json, CartBean.class);
iCartView.showCartData(cartBean);
double num =0;
iCartView.showNum(num);
}
@Override
public void detailLoadError(String error) {
Log.d(TAG, "detailLoadError: 失败+++++++++++++++++++++++");
}
});
}
@Override
public void showCartNum(IModel iModel,CartBean cartBean, ICartView iCartView) {
double num = iModel.jisuanNum(cartBean);
iCartView.showNum(num);
}
@Override
public void updateCartData_IPresenter(IModel iModel, CartBean.DataBean.ListBean listBean, final ICartView iCartView) {
Map<String, Object> map = new HashMap<>();
map.put("uid", "71");
map.put("sellerid", (int)listBean.getSellerid());
map.put("pid", (int)listBean.getPid());
map.put("num", (int)listBean.getNum());
map.put("selected", (int)listBean.getSelected());
iModel.getDetailData(HttpConfig.url_upadtecarts, map, new OnDetailLoadListener() {
@Override
public void detailLoadSuccess(String json) {
/*Gson gson = new Gson();
CartBean cartBean = gson.fromJson(json, CartBean.class);
iCartView.showCartData(cartBean);
double num =0;
iCartView.showNum(num);*/
Log.d(TAG, "detailLoadSuccess: 修改成功++++++++++++++++++++");
}
@Override
public void detailLoadError(String error) {
Log.d(TAG, "detailLoadError: 修改失败+++++++++++++++++++++++");
}
});
}
@Override
public void deleteCartData_Ipresenter(IModel iModel, CartBean.DataBean.ListBean listBean, ICartView iCartView) {
Map<String, Object> map = new HashMap<>();
map.put("uid", "71");
map.put("pid", (int)listBean.getPid());
iModel.getDetailData(HttpConfig.url_deletecarts, map, new OnDetailLoadListener() {
@Override
public void detailLoadSuccess(String json) {
/*Gson gson = new Gson();
CartBean cartBean = gson.fromJson(json, CartBean.class);
iCartView.showCartData(cartBean);
double num =0;
iCartView.showNum(num);*/
Log.d(TAG, "detailLoadSuccess: 删除成功++++++++++++++++++++"+json);
}
@Override
public void detailLoadError(String error) {
Log.d(TAG, "detailLoadError: 删除失败+++++++++++++++++++++++"+error);
}
});
}
}