导入依赖
com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
//okhttp
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
//gson
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
implementation 'com.android.support:design:27.1.1'
Model
GetCartModel
package com.example.a1512qweek4.model;
import com.example.a1512qweek4.net.OnNetListener;
public interface GetCartsModel {
void getCarts(String uid, String token, OnNetListener onNetListener);
}
---------------------------------------------------------------------------------------------------------------
GetCartModelImp
package com.example.a1512qweek4.model;import com.example.a1512qweek4.net.Api;
import com.example.a1512qweek4.net.OkhttpUtils;
import com.example.a1512qweek4.net.OnNetListener;
import java.util.HashMap;
import java.util.Map;
public class GetCartsModelImp implements GetCartsModel {
@Override
public void getCarts(String uid, String token, final OnNetListener onNetListener) {
Map<String, String> params = new HashMap<>();
params.put("uid", uid);
params.put("token", token);
OkhttpUtils.getInstance().doPost(Api.GETCARTS_URL, params, new OnNetListener() {
@Override
public void onSuccess(String result) {
onNetListener.onSuccess(result);
}
@Override
public void onFailed(Exception e) {
onNetListener.onFailed(e);
}
});
}
}
-------------------------------------------------------------------------------------------------------------------------------
UpdateCartModel
package com.example.a1512qweek4.model;import com.example.a1512qweek4.net.OnNetListener;
public interface UpdateCartsModel {
void updateCarts(String uid, String sellerid, String pid, String num, String selected, String token,
OnNetListener onNetListener);
}
-----------------------------------------------------------------------------------------------------------------------------
UpdateCartModelImp
package com.example.a1512qweek4.model;
import com.example.a1512qweek4.net.Api;
import com.example.a1512qweek4.net.OkhttpUtils;
import com.example.a1512qweek4.net.OnNetListener;
import java.util.HashMap;
import java.util.Map;
public class UpdateCartsModelImp implements UpdateCartsModel{
@Override
public void updateCarts(String uid, String sellerid, String pid, String num, String selected, String token, final OnNetListener onNetListener) {
Map<String,String> params = new HashMap<>();
params.put("uid",uid);
params.put("sellerid",sellerid);
params.put("pid",pid);
params.put("num",num);
params.put("selected",selected);
params.put("token",token);
OkhttpUtils.getInstance().doPost(Api.UPDATECARTS_URL, params, new OnNetListener() {
@Override
public void onSuccess(String result) {
onNetListener.onSuccess(result);
}
@Override
public void onFailed(Exception e) {
onNetListener.onFailed(e);
}
});
}
}
---------------------------------------------------------------------------------------------------------------------------------
Presenter
GetCartPresenter
package com.example.a1512qweek4.presenter;public interface GetCartsPresenter {
void getCarts(String uid, String token);
}
---------------------------------------------------------------------------------------------------------------------------------
GetCartPresenterImp
package com.example.a1512qweek4.presenter;
import com.example.a1512qweek4.bean.GetCartsBean;
import com.example.a1512qweek4.bean.SellerBean;
import com.example.a1512qweek4.model.GetCartsModelImp;
import com.example.a1512qweek4.net.OnNetListener;
import com.example.a1512qweek4.view.GetCartsView;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class GetCartsPresenterImp implements GetCartsPresenter {
private final GetCartsModelImp getCartsModelImp;
private GetCartsView getCartsView;
public GetCartsPresenterImp(GetCartsView getCartsView) {
this.getCartsView = getCartsView;
getCartsModelImp = new GetCartsModelImp();
}
public void detach() {
if (getCartsView != null) {
getCartsView = null;
}
}
@Override
public void getCarts(String uid, String token) {
getCartsModelImp.getCarts(uid, token, new OnNetListener() {
@Override
public void onSuccess(String result) {
//给View层显示
if (getCartsView != null) {
List<SellerBean> groupList = new ArrayList<>();
List<List<GetCartsBean.DataBean.ListBean>> childList = new ArrayList<>();
//解析服务器返回的数据
GetCartsBean getCartsBean = new Gson().fromJson(result, GetCartsBean.class);
//需要对返回的数据进行二次封装,以满足二级列表显示的需要
List<GetCartsBean.DataBean> data = getCartsBean.getData();
for (int i = 0; i < data.size(); i++) {
GetCartsBean.DataBean dataBean = data.get(i);
//封装二级列表数据
List<GetCartsBean.DataBean.ListBean> list = dataBean.getList();
childList.add(list);
//封装一级列表数据
SellerBean sellerBean = new SellerBean();
sellerBean.setSellName(dataBean.getSellerName());
sellerBean.setSellId(dataBean.getSellerid());
sellerBean.setChecked(isSellerChecked(list));
groupList.add(sellerBean);
}
getCartsView.show(groupList, childList);
}
}
@Override
public void onFailed(Exception e) {
}
});
}
private boolean isSellerChecked(List<GetCartsBean.DataBean.ListBean> list) {
for (int i = 0; i < list.size(); i++) {
GetCartsBean.DataBean.ListBean listBean = list.get(i);
if (listBean.getSelected() == 0) {
return false;
}
}
return true;
}
}
---------------------------------------------------------------------------------------------------------------------------------
UpdateCartPresenter
package com.example.a1512qweek4.presenter;public interface UpdateCartsPresenter {
void updateCarts(String uid, String sellerid, String pid, String num, String selected, String token);
}
---------------------------------------------------------------------------------------------------------------------------------
UpdateCartPresenterImp
package com.example.a1512qweek4.presenter;import com.example.a1512qweek4.model.UpdateCartsModelImp;
import com.example.a1512qweek4.net.OnNetListener;
import com.example.a1512qweek4.view.UpdataCartsView;
public class UpdateCartsPresenterImp implements UpdateCartsPresenter {
private final UpdateCartsModelImp updateCartsModelImp;
private UpdataCartsView updataCartsView;
public UpdateCartsPresenterImp(UpdataCartsView updataCartsView) {
this.updataCartsView = updataCartsView;
updateCartsModelImp = new UpdateCartsModelImp();
}
@Override
public void updateCarts(String uid, String sellerid, String pid, String num, String selected, String token) {
updateCartsModelImp.updateCarts(uid, sellerid, pid, num, selected, token, new OnNetListener() {
@Override
public void onSuccess(String result) {
if (updataCartsView != null) {
updataCartsView.updateSucess();
}
}
@Override
public void onFailed(Exception e) {
}
});
}
}
----------------------------------------------------------------------------------------------------------------------------
View
GetCartView
package com.example.a1512qweek4.view;
import com.example.a1512qweek4.bean.GetCartsBean;
import com.example.a1512qweek4.bean.SellerBean;
import java.util.List;
public interface GetCartsView {
void show(List<SellerBean> groupList, List<List<GetCartsBean.DataBean.ListBean>> childList);
}
-------------------------------------------------------------------------------------------------------------------------------
UpdateCartView
package com.example.a1512qweek4.view;public interface UpdataCartsView {
void updateSucess();
}
-------------------------------------------------------------------------------------------------------------------------------
net
Api
package com.example.a1512qweek4.net;
public interface Api {
String GETCARTS_URL = "https://www.zhaoapi.cn/product/getCarts";
String LOGIN_URL = "https://www.zhaoapi.cn/user/login?mobile=18310830365&password=123456";
String UPDATECARTS_URL = "https://www.zhaoapi.cn/product/updateCarts";
String UPLOADHEADER = "https://www.zhaoapi.cn/file/upload";
}
----------------------------------------------------------------------------------------------------------------------------
MyIntercerport
package com.example.a1512qweek4.net;import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* 自定义拦截器封装公共参数
*/
public class MyInterceptor implements Interceptor {
private Response response;
@Override
public Response intercept(Chain chain) throws IOException {
//获取原始的Request请求
Request originalRequest = chain.request();
//判断是GET请求还是POST请求
String method = originalRequest.method();
if ("GET".equals(method)) {
// String orginalUrl = originalRequest.url().toString();
// String url = orginalUrl+"&source=android";
HttpUrl httpUrl = originalRequest.url()
.newBuilder()
.addQueryParameter("source", "android")
.build();
Request request = new Request.Builder()
.url(httpUrl)
.build();
//发送拼接完成后的请求
response = chain.proceed(request);
} else {
RequestBody requestBody = originalRequest.body();
if (requestBody instanceof FormBody) {
FormBody.Builder builder = new FormBody.Builder();
FormBody originalformBody = (FormBody) originalRequest.body();
for (int i = 0; i < originalformBody.size(); i++) {
builder.add(originalformBody.name(i), originalformBody.value(i));
}
builder.add("source", "android");
FormBody formBody = builder.build();
Request request = originalRequest.newBuilder().post(formBody).build();
response = chain.proceed(request);
} else {
//发送请求
response = chain.proceed(originalRequest);
}
}
return response;
}
}
---------------------------------------------------------------------------------------------------------------------------------
OkhttpUtils
package com.example.a1512qweek4.net;import android.os.Handler;
import android.os.Looper;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkhttpUtils {
private static OkhttpUtils instance;
private final OkHttpClient okHttpClient;
private final Handler handler;
private OkhttpUtils() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)//连接超时
.writeTimeout(20, TimeUnit.SECONDS)//写入超时
.readTimeout(20, TimeUnit.SECONDS)//读取超时
.addInterceptor(new MyInterceptor())
.addInterceptor(logging)
.build();
handler = new Handler(Looper.getMainLooper());
}
public static OkhttpUtils getInstance() {
if (instance == null) {
instance = new OkhttpUtils();
}
return instance;
}
/**
* GET请求
*
* @param url
*/
public void doGet(String url, final OnNetListener onNetListener) {
//创建Request
final Request request = new Request.Builder()
.url(url)
.build();
//发送请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onFailed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//拿到服务器返回的数据
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onSuccess(string);
}
});
}
});
}
/**
* POST请求
*
* @param url
* @param params
* @param onNetListener
*/
public void doPost(String url, Map<String, String> params, final OnNetListener onNetListener) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
//创建FormBody
FormBody formBody = builder.build();
//创建Request
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
//请求数据
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onFailed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//拿到服务器返回的数据
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onSuccess(string);
}
});
}
});
}
public void uploadFile(String url, Map<String, String> params, String fileName, File file, final OnNetListener
onNetListener) {
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
//上传参数
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.addFormDataPart(entry.getKey(), entry.getValue());
}
builder.addFormDataPart("file", fileName, RequestBody.create(MediaType.parse("application/octet-stream"),
file));
MultipartBody multipartBody = builder.build();
final Request request = new Request.Builder()
.url(url)
.post(multipartBody)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onFailed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onSuccess(string);
}
});
}
});
}
}
-------------------------------------------------------------------------------------------------------------------------------
OnNetListener
package com.example.a1512qweek4.net;
public interface OnNetListener {
void onSuccess(String result);
void onFailed(Exception e);
}
--------------------------------------------------------------------------------------------------------------------------------
AddSubView
package com.example.a1512qweek4;import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;
public class AddSubView extends LinearLayout {
private TextView tvSub;
private TextView tvNum;
private TextView tvAdd;
public AddSubView(Context context) {
this(context, null);
}
public AddSubView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//初始化布局
LayoutInflater.from(context).inflate(R.layout.addsubview, this);
tvSub = findViewById(R.id.tvSub);
tvNum = findViewById(R.id.tvNum);
tvAdd = findViewById(R.id.tvAdd);
}
public void setNum(String num) {
tvNum.setText(num);
}
public String getNum() {
return tvNum.getText().toString();
}
public void setOnSubClickListener(OnClickListener onClickListener){
tvSub.setOnClickListener(onClickListener);
}
public void setOnAddClickListener(OnClickListener onClickListener){
tvAdd.setOnClickListener(onClickListener);
}
}
------------------------------------------------------------------------------------------------------------------------------
ElvAdapter
package com.example.a1512qweek4;import android.content.Context;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.a1512qweek4.bean.GetCartsBean;
import com.example.a1512qweek4.bean.SellerBean;
import com.example.a1512qweek4.presenter.GetCartsPresenterImp;
import com.example.a1512qweek4.presenter.UpdateCartsPresenterImp;
import com.example.a1512qweek4.view.UpdataCartsView;
import java.util.List;
public class ElvAdapter extends BaseExpandableListAdapter implements UpdataCartsView {
private final String uid;
private final String token;
private Context context;
private LayoutInflater inflater;
private List<SellerBean> groupList;
private List<List<GetCartsBean.DataBean.ListBean>> childList;
private final UpdateCartsPresenterImp updateCartsPresenterImp;
private GetCartsPresenterImp getCartsPresenterImp;
private int childIndex;
private boolean isSellerChecked;//商家是否选中
private int groupIndex;//表示当前点击的是哪个商家
private static final int GET_CARTS = 0;
private static final int UPDATE_CART = 1;
private static final int UPDATE_SELLER = 2;
public static int state;
public ElvAdapter(Context context, List<SellerBean> groupList, List<List<GetCartsBean.DataBean.ListBean>>
childList, GetCartsPresenterImp getCartsPresenterImp) {
this.context = context;
this.groupList = groupList;
this.childList = childList;
this.getCartsPresenterImp = getCartsPresenterImp;
inflater = LayoutInflater.from(context);
//绑定
updateCartsPresenterImp = new UpdateCartsPresenterImp(this);
//从SharedPreferences获取登录时保存的uid和token值
SharedPreferences sharedPreferences = context.getSharedPreferences("user", Context.MODE_PRIVATE);
uid = sharedPreferences.getString("uid", "");
token = sharedPreferences.getString("token", "");
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return childList.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childList.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
final GroupViewHolder groupViewHolder;
if (convertView == null) {
groupViewHolder = new GroupViewHolder();
convertView = inflater.inflate(R.layout.elv_group_item, null);
groupViewHolder.cbGroup = convertView.findViewById(R.id.cbGroup);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
//设置值
final SellerBean sellerBean = groupList.get(groupPosition);
groupViewHolder.cbGroup.setText(sellerBean.getSellName());
groupViewHolder.cbGroup.setChecked(sellerBean.isChecked());
//给商家设置点击事件
groupViewHolder.cbGroup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = UPDATE_CART;
groupIndex = groupPosition;
//更新购物车列表
isSellerChecked = groupViewHolder.cbGroup.isChecked();
//初始化商品的下标为0
childIndex = 0;
updateProduct();
}
});
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup
parent) {
final ChildViewHolder childViewHolder;
if (convertView == null) {
childViewHolder = new ChildViewHolder();
convertView = inflater.inflate(R.layout.elv_child_item, null);
childViewHolder.cbChild = convertView.findViewById(R.id.cbChild);
childViewHolder.iv = convertView.findViewById(R.id.iv);
childViewHolder.tvTitle = convertView.findViewById(R.id.tvTitle);
childViewHolder.tvPrice = convertView.findViewById(R.id.tvPrice);
childViewHolder.addSubView = convertView.findViewById(R.id.addSub);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
//设置值
final GetCartsBean.DataBean.ListBean listBean = childList.get(groupPosition).get(childPosition);
childViewHolder.cbChild.setChecked(listBean.getSelected() == 0 ? false : true);
Glide.with(context).load(listBean.getImages().split("\\|")[0]).into(childViewHolder.iv);
childViewHolder.tvTitle.setText(listBean.getTitle());
childViewHolder.tvPrice.setText("优惠价:¥" + listBean.getPrice());
childViewHolder.addSubView.setNum(listBean.getNum() + "");
//给cbChild设置点击事件
childViewHolder.cbChild.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = GET_CARTS;
//更新购物车列表
boolean checked = childViewHolder.cbChild.isChecked();
String selected = checked ? "1" : "0";
int sellerid = listBean.getSellerid();
int pid = listBean.getPid();
String num = childViewHolder.addSubView.getNum();
updateCartsPresenterImp.updateCarts(uid, sellerid + "", pid + "", num, selected, token);
}
});
//给减号设置点击事件
childViewHolder.addSubView.setOnSubClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = GET_CARTS;
//更新购物车列表
boolean checked = childViewHolder.cbChild.isChecked();
String selected = checked ? "1" : "0";
int sellerid = listBean.getSellerid();
int pid = listBean.getPid();
String num = childViewHolder.addSubView.getNum();
int n = Integer.parseInt(num);
if (n <= 1) {
Toast.makeText(context, "商品数量不能小于1", Toast.LENGTH_SHORT).show();
return;
}
num = (n - 1) + "";
updateCartsPresenterImp.updateCarts(uid, sellerid + "", pid + "", num, selected, token);
}
});
//给加号设置点击事件
childViewHolder.addSubView.setOnAddClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = GET_CARTS;
//更新购物车列表
boolean checked = childViewHolder.cbChild.isChecked();
String selected = checked ? "1" : "0";
int sellerid = listBean.getSellerid();
int pid = listBean.getPid();
String num = childViewHolder.addSubView.getNum();
int n = Integer.parseInt(num);
num = (n + 1) + "";
updateCartsPresenterImp.updateCarts(uid, sellerid + "", pid + "", num, selected, token);
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class GroupViewHolder {
CheckBox cbGroup;
TextView tvSeller;
}
class ChildViewHolder {
CheckBox cbChild;
ImageView iv;
TextView tvTitle;
TextView tvPrice;
AddSubView addSubView;
}
private void updateProduct() {
String selected = isSellerChecked ? "1" : "0";
SellerBean sellerBean = groupList.get(groupIndex);
String sellerid = sellerBean.getSellId();
List<GetCartsBean.DataBean.ListBean> listBeans = childList.get(groupIndex);
int pid = listBeans.get(childIndex).getPid();
int num = listBeans.get(childIndex).getNum();
updateCartsPresenterImp.updateCarts(uid, sellerid, pid + "", num + "", selected, token);
}
public void updateSeller(boolean isChecked) {
state = UPDATE_SELLER;
isSellerChecked = isChecked;
groupIndex = 0;
childIndex = 0;
updateProduct();
}
/*
更新购物车成功回调接口
*/
@Override
public void updateSucess() {
switch (state) {
case GET_CARTS:
//更新成功后,再次调用获取购物车的接口
getCartsPresenterImp.getCarts(uid, token);
break;
case UPDATE_CART:
childIndex++;
if (childIndex >= childList.get(groupIndex).size()) {
//更新成功后,再次调用获取购物车的接口
// getCartsPresenterImp.getCarts(uid, token);
state = GET_CARTS;
updateSucess();
} else {
updateProduct();
}
break;
case UPDATE_SELLER:
childIndex++;
if (childIndex >= childList.get(groupIndex).size()) {
//该商家下的所有商品都已更新完成,接着更新其它商家下的商品
groupIndex++;
if (groupIndex>=groupList.size()){
//所有商家都已更新完成,重新获取购物车
// getCartsPresenterImp.getCarts(uid, token);
state = GET_CARTS;
updateSucess();
}else{
//还有别的商家未更新
childIndex = 0;
updateProduct();
}
}else{
updateProduct();
}
break;
}
}
}
-----------------------------------------------------------------------------------------------------------------------------
MainActivity
package com.example.a1512qweek4.view;import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.a1512qweek4.ElvAdapter;
import com.example.a1512qweek4.R;
import com.example.a1512qweek4.bean.GetCartsBean;
import com.example.a1512qweek4.bean.SellerBean;
import com.example.a1512qweek4.presenter.GetCartsPresenterImp;
import java.util.List;
public class MainActivity extends AppCompatActivity implements GetCartsView, View.OnClickListener {
private ExpandableListView mElv;
/**
* 全选/反选
*/
private CheckBox mCbAll;
/**
* 总价
*/
private TextView mTvMoney;
private TextView mTvTotal;
private GetCartsPresenterImp getCartsPresenterImp;
private ElvAdapter elvAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
SharedPreferences sharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
String uid = sharedPreferences.getString("uid", "");
String token = sharedPreferences.getString("token", "");
//绑定
getCartsPresenterImp = new GetCartsPresenterImp(this);
getCartsPresenterImp.getCarts(uid, token);
}
@Override
protected void onDestroy() {
super.onDestroy();
getCartsPresenterImp.detach();
}
@Override
public void show(List<SellerBean> groupList, List<List<GetCartsBean.DataBean.ListBean>> childList) {
elvAdapter = new ElvAdapter(this, groupList, childList, getCartsPresenterImp);
mElv.setAdapter(elvAdapter);
for (int i = 0; i < groupList.size(); i++) {
mElv.expandGroup(i);
}
}
private void initView() {
mElv = (ExpandableListView) findViewById(R.id.elv);
mCbAll = (CheckBox) findViewById(R.id.cbAll);
mTvMoney = (TextView) findViewById(R.id.tvMoney);
mTvTotal = (TextView) findViewById(R.id.tvTotal);
mCbAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (elvAdapter != null) {
elvAdapter.updateSeller(mCbAll.isChecked());
}
}
});
mTvTotal.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.tvTotal:
//跳转到我的页面
Intent intent = new Intent(MainActivity.this,MineActivity.class);
startActivity(intent);
break;
}
}
}
------------------------------------------------------------------------------------------------------------------------------
LoginActivity
package com.example.a1512qweek4.view;import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.a1512qweek4.R;
import com.example.a1512qweek4.bean.UserBean;
import com.example.a1512qweek4.net.Api;
import com.example.a1512qweek4.net.OkhttpUtils;
import com.example.a1512qweek4.net.OnNetListener;
import com.google.gson.Gson;
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
/**
* 登录
*/
private Button mBt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
}
private void initView() {
mBt = (Button) findViewById(R.id.bt);
mBt.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.bt:
OkhttpUtils.getInstance().doGet(Api.LOGIN_URL, new OnNetListener() {
@Override
public void onSuccess(String result) {
UserBean userBean = new Gson().fromJson(result, UserBean.class);
//保存用户信息
SharedPreferences sharedPreferences = LoginActivity.this.getSharedPreferences("user", Context
.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putString("uid", userBean.getData().getUid() + "");
edit.putString("token", userBean.getData().getToken());
edit.commit();
Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
//跳转到购物车页面
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
//关闭当前页面
LoginActivity.this.finish();
}
@Override
public void onFailed(Exception e) {
}
});
break;
}
}
}
--------------------------------------------------------------------------------------------------------------------------------
MineActivity
package com.example.a1512qweek4.view;import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import com.example.a1512qweek4.R;
import com.example.a1512qweek4.net.Api;
import com.example.a1512qweek4.net.OkhttpUtils;
import com.example.a1512qweek4.net.OnNetListener;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
public class MineActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView mIv;
private LinearLayout mLl;
private PopupWindow popupWindow;
private String imgPath;
private String imgCropPath;
private Uri imageFileUri;
private String uid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mine);
imgPath = getExternalCacheDir().getPath() + "/header.jpg";
imgCropPath = getExternalCacheDir().getPath() + "/header_crop.jpg";
File file = new File(imgPath);
imageFileUri = Uri.fromFile(file);
initView();
SharedPreferences sharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
uid = sharedPreferences.getString("uid", "");
}
private void initView() {
mIv = (ImageView) findViewById(R.id.iv);
mIv.setOnClickListener(this);
mLl = (LinearLayout) findViewById(R.id.ll);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.iv:
//弹出PopupWindow
View view = View.inflate(MineActivity.this, R.layout.pop_item, null);
initPopItem(view);
popupWindow = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout
.LayoutParams.WRAP_CONTENT);
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.showAtLocation(mLl, Gravity.BOTTOM, 0, 0);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1000:
if (resultCode == RESULT_OK) {
//拍照成功,剪切图片
Toast.makeText(MineActivity.this, "拍照成功", Toast.LENGTH_SHORT).show();
crop(imageFileUri);
}
break;
case 2000:
try {
//拍照后裁剪成功
//先获取裁剪后的图片
Bitmap bitmap = data.getParcelableExtra("data");
File file = new File(imgCropPath);
//判断该文件创建
if (file.exists()) {
file.delete();
}
//创建出新的文件
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
//把裁剪后的图片保存到本地
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
//上传到服务器
Map<String, String> params = new HashMap<>();
params.put("uid", uid);
OkhttpUtils.getInstance().uploadFile(Api.UPLOADHEADER, params, "header_crop.jpg", file, new
OnNetListener() {
@Override
public void onSuccess(String result) {
Toast.makeText(MineActivity.this, result, Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(Exception e) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
break;
case 3000:
Uri uri = data.getData();
crop(uri);
break;
}
}
private void crop(Uri uri) {
Intent intent = new Intent();
//指定裁剪的动作
intent.setAction("com.android.camera.action.CROP");
//设置裁剪的数据(uri路径)....裁剪的类型(image/*)
intent.setDataAndType(uri, "image/*");
//执行裁剪的指令
intent.putExtra("crop", "true");
//指定裁剪框的宽高比
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//指定输出的时候宽度和高度
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
//设置取消人脸识别
intent.putExtra("noFaceDetection", false);
//设置返回数据
intent.putExtra("return-data", true);
//
startActivityForResult(intent, 2000);
}
private void initPopItem(View view) {
TextView tvCamera = view.findViewById(R.id.tvCamera);
TextView tvCancle = view.findViewById(R.id.tvCancle);
TextView tvPhoto = view.findViewById(R.id.tvPhoto);
tvCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();
}
//调用相机,需要隐式意图
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);
startActivityForResult(intent, 1000);
}
});
tvPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();
}
Intent intent = new Intent();
//指定选择/获取的动作...PICK获取,拿
intent.setAction(Intent.ACTION_PICK);
//指定获取的数据的类型
intent.setType("image/*");
startActivityForResult(intent, 3000);
}
});
tvCancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();
}
}
});
}
}