//////////////////////////////////父布局需要的属性
package com.example.gshopping.bean;
//一级的商家和选框
public class GroupBean {
private String sellerName;///
private boolean gropuCb;
public GroupBean(String sellerName, boolean gropuCb) {
this.sellerName = sellerName;
this.gropuCb = gropuCb;
}
public String getSellerName() {
return sellerName;
}
public void setSellerName(String sellerName) {
this.sellerName = sellerName;
}
public boolean isGropuCb() {
return gropuCb;
}
public void setGropuCb(boolean gropuCb) {
this.gropuCb = gropuCb;
}
}
////////////////////////////////////////子布局需要的属性
package com.example.gshopping.bean;
public class ChildBean {
private String title;
private String images;
private double price;
private int num;
private boolean childCb;
private boolean btn;
public ChildBean(String title, String images, double price, int num, boolean childCb, boolean btn) {
this.title = title;
this.images = images;
this.price = price;
this.num = num;
this.childCb = childCb;
this.btn = btn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImages() {
return images;
}
public void setImages(String images) {
this.images = images;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public boolean isChildCb() {
return childCb;
}
public void setChildCb(boolean childCb) {
this.childCb = childCb;
}
public boolean isBtn() {
return btn;
}
public void setBtn(boolean btn) {
this.btn = btn;
}
}
//////////////////////////////////////////工具类M层请求网络的代码
package com.example.gshopping.httputils;
import android.os.Handler;
import com.example.gshopping.interfaces.CallBack;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class HttpUtils {
private static volatile HttpUtils instance;
private static Handler handler = new Handler();
private HttpUtils(){
}
public static HttpUtils getInstance() {
if (instance == null) {
synchronized (HttpUtils.class) {
if (instance == null) {
instance = new HttpUtils();
}
}
}
return instance;
}
//get请求
public void get(String url, Map<String,String> map, final CallBack callBack, final Class c,final String tag){
//对url和参数做拼接处理
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(url);
//判断是否存在? if中是存在
if(stringBuffer.indexOf("?")!=-1 ){
//判断?是否在最后一位 if中是不在最后一位
if(stringBuffer.indexOf("?")!=stringBuffer.length()-1){
stringBuffer.append("&");
}
}else{
stringBuffer.append("?");
}
for(Map.Entry<String,String> entry:map.entrySet()){
stringBuffer.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
//判断是否存在& if中是存在
if(stringBuffer.indexOf("&")!=-1){
stringBuffer.deleteCharAt(stringBuffer.lastIndexOf("&"));
}
//1:创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2:创建Request对象
final Request request = new Request.Builder()
.get()
.url(stringBuffer.toString())
.build();
//3:创建Call对象
Call call = okHttpClient.newCall(request);
//4:请求网络
call.enqueue(new Callback() {
//请求失败
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e,tag);
}
});
}
//请求成功
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
//拿到数据解析
final Object o = new Gson().fromJson(result, c);
//当前是在子线程,回到主线程中
handler.post(new Runnable() {
@Override
public void run() {
//回调
callBack.onSuccess(o,tag);
}
});
}
});
}
//post请求
public void post(String url, Map<String,String> map, final CallBack callBack, final Class c,final String tag){
//1:创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2:提供post请求需要的body对象
FormBody.Builder builder = new FormBody.Builder();
for(Map.Entry<String,String> entry:map.entrySet()){
builder.add(entry.getKey(),entry.getValue());
}
FormBody body = builder.build();
//3:创建Request对象
final Request request = new Request.Builder()
.post(body)
.url(url)
.build();
//4:创建Call对象
Call call = okHttpClient.newCall(request);
//5:请求网络
call.enqueue(new Callback() {
//请求失败
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e,tag);
}
});
}
//请求成功
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
//拿到数据解析
final Object o = new Gson().fromJson(result, c);
//当前是在子线程,回到主线程中
handler.post(new Runnable() {
@Override
public void run() {
//回调
callBack.onSuccess(o,tag);
}
});
}
});
}
}
///////////////////////////////////persenres层的代码
package com.example.gshopping.persener;
import com.example.gshopping.httputils.HttpUtils;
import com.example.gshopping.interfaces.CallBack;
import com.example.gshopping.interfaces.Iview;
import java.util.Map;
public class Persener {
private Iview inv;
public void attach(Iview inv){
this.inv=inv;
}
public void get(String url, Map<String,String>map,Class cls, String tag){
HttpUtils.getInstance().get(url, map, new CallBack() {
@Override
public void onSuccess(Object o, String tag) {
if (o!=null){
inv.onSuccess(o,tag);
}
}
@Override
public void onFailed(Exception e, String tag) {
inv.onSuccess(e,tag);
}
},cls,tag);
}
//内存
public void deleteView(){
if(inv!=null){
inv=null;
}
}
}
///////////////////////////////////CallBack接口的代码
public interface CallBack {
void onSuccess(Object o,String tag);
void onFailed(Exception e,String tag);
}
///////////////////////////////////View接口的代码
public interface Iview {
void onSuccess(Object o,String tag);
void onFailed(Exception e,String tag);
}
//////////////////////////////////算钱时的接口代码
public interface MoneyView {
void isCheck(List<List<ChildBean>> list);
}
///////////////////////////////////MainActivity的代码
package com.example.gshopping;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.gshopping.adapter.ExpandableAdapter;
import com.example.gshopping.bean.ChildBean;
import com.example.gshopping.bean.GroupBean;
import com.example.gshopping.bean.Zbean;
import com.example.gshopping.interfaces.Iview;
import com.example.gshopping.persener.Persener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity implements Iview,MoneyView{
private Persener persener;
List<GroupBean> groupBeen=new ArrayList<>();
List<List<ChildBean>> childBeen=new ArrayList<>();
private ExpandableListView elv;
private CheckBox all_chekbox;
private TextView total_price;
private TextView totalnumber;
private ExpandableAdapter expandableAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
elv =(ExpandableListView)findViewById(R.id.elv);
all_chekbox =(CheckBox)findViewById(R.id.all_chekbox);
total_price =(TextView)findViewById(R.id.total_price);//价钱
totalnumber = (TextView)findViewById(R.id.total_number);//底部数量
//全选的点击事件
all_chekbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//初始值
double money = 0;
//判断全选的check是否为选择状态
if(all_chekbox.isChecked()){
//更改父子check状态
for (int i=0;i<groupBeen.size();i++){
groupBeen.get(i).setGropuCb(true);
List<ChildBean> childBeen = MainActivity.this.childBeen.get(i);
for(int x=0;x<childBeen.size();x++){
childBeen.get(x).setChildCb(true);
//计算全选的价格
int num = childBeen.get(x).getNum();
double price = childBeen.get(x).getPrice();
money=money+num*price;
}
}
//设置底部的价格money的显示
total_price.setText(money+"");
}else{
for (int i=0;i<groupBeen.size();i++){
groupBeen.get(i).setGropuCb(false);
List<ChildBean> childBeen = MainActivity.this.childBeen.get(i);
for(int x=0;x<childBeen.size();x++){
childBeen.get(x).setChildCb(false);
}
}
total_price.setText(0+"");
}
expandableAdapter.notifyDataSetChanged();
}
});
//将P层对象创建出来
persener = new Persener();
persener.attach(this);
HashMap<String, String> map = new HashMap<>();
persener.get(" http://120.27.23.105/product/getCarts?uid=100",map,Zbean.class,"car");
}
//传过来数据之后进行获取并向集合添加
@Override
public void onSuccess(Object o, String tag) {
if (o!=null&&tag.equals("car")){
Zbean bean=(Zbean)o;
List<Zbean.DataBean> data = bean.getData();
for(Zbean.DataBean i:data){
GroupBean groupBean = new GroupBean(i.getSellerName(), false);
this.groupBeen.add(groupBean);
//二级
List<Zbean.DataBean.ListBean> list = i.getList();
List<ChildBean> ls=new ArrayList<>();
for(Zbean.DataBean.ListBean w:list){
String[] split = w.getImages().toString().split("\\|");
ChildBean childBean = new ChildBean(w.getTitle(), split[0], w.getPrice(), 1, false, false);
ls.add(childBean);
}
this.childBeen.add(ls);
}
expandableAdapter = new ExpandableAdapter(MainActivity.this, groupBeen, childBeen,this);
elv.setAdapter(expandableAdapter);
}
}
@Override
public void onFailed(Exception e, String tag) {
}
//算钱的接口
@Override
public void isCheck(List<List<ChildBean>> list) {
double money=0;
for (int i=0;i<childBeen.size();i++){
List<ChildBean> childBeen = MainActivity.this.childBeen.get(i);
for(int x=0;x<childBeen.size();x++){
//计算全选的价格
if(childBeen.get(x).isChildCb()){
int num = childBeen.get(x).getNum();
double price = childBeen.get(x).getPrice();
money=money+num*price;
}
}
}
//设置底部的价格money的显示
total_price.setText(money+"");
}
}
///////////////////////////////////////二级适配器的代码
package com.example.gshopping.adapter;
import android.content.Context;
import android.util.Log;
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 com.bumptech.glide.Glide;
import com.example.gshopping.AddDeleteView;
import com.example.gshopping.MainActivity;
import com.example.gshopping.MoneyView;
import com.example.gshopping.R;
import com.example.gshopping.bean.ChildBean;
import com.example.gshopping.bean.GroupBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by on 2017/11/20.
*/
public class ExpandableAdapter extends BaseExpandableListAdapter {
private Context context;
private List<GroupBean> groupBeen;
private List<List<ChildBean>> childBeen;
private TextView shop_title;
private ImageView shop_img;
private TextView shop_price;
//实现该接口
private MoneyView moneyview;
public ExpandableAdapter(Context context, List<GroupBean> groupBeen, List<List<ChildBean>> childBeen,MoneyView moneyview) {
this.context = context;
this.groupBeen = groupBeen;
this.childBeen = childBeen;
this.moneyview = moneyview;
}
@Override
public int getGroupCount() {
return groupBeen.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return childBeen.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return groupBeen.get(groupPosition).getSellerName();
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childBeen.get(groupPosition).get(childPosition).getTitle();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View view = View.inflate(context, R.layout.grouplist, null);
final CheckBox groupCb =(CheckBox)view.findViewById(R.id.group_checkbox);
TextView shopName = (TextView) view.findViewById(R.id.shop_name);
shopName.setText(groupBeen.get(groupPosition).getSellerName());
groupCb.setChecked(groupBeen.get(groupPosition).isGropuCb());
//一级的复选框
groupCb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//checked 一级的check
if(groupCb.isChecked()==true){
//遍历子集合 让子集合中的Boolean值改为true
List<ChildBean> childBeen1 = childBeen.get(groupPosition);
for(int x=0;x<childBeen1.size();x++){
childBeen1.get(x).setChildCb(true);
}
//改父级别的check的值
groupBeen.get(groupPosition).setGropuCb(true);
//刷新 重新加载
notifyDataSetChanged();
moneyview.isCheck(childBeen);
}else{
List<ChildBean> childBeen1 = childBeen.get(groupPosition);
for(int x=0;x<childBeen1.size();x++){
childBeen1.get(x).setChildCb(false);
}
groupBeen.get(groupPosition).setGropuCb(false);
notifyDataSetChanged();
}
//3全选设置
//得到Activity的全选按钮
MainActivity tag= (MainActivity) context;
CheckBox checkAll= (CheckBox) tag.findViewById(R.id.all_chekbox);
//设置一个初始的boolean值 用来判断
Boolean A=true;
//遍历父集合
for(int i=0;i<groupBeen.size();i++){
boolean gropuCb = groupBeen.get(i).isGropuCb();
if(gropuCb!=true){
A=false;
break;
}
}
//设置全选按钮
checkAll.setChecked(A);
moneyview.isCheck(childBeen);
}
});
return view;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View view = View.inflate(context, R.layout.childlist, null);
final CheckBox childCheck= (CheckBox) view.findViewById(R.id.child_checkbox);
shop_title =(TextView)view.findViewById(R.id.shop_title);
shop_img =(ImageView)view.findViewById(R.id.shop_img);
shop_price =(TextView)view.findViewById(R.id.shop_price);
//找到自定义的View主键
final AddDeleteView adv= (AddDeleteView) view.findViewById(R.id.adddeleteview);
adv.setNumber(childBeen.get(groupPosition).get(childPosition).getNum());
adv.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {
@Override
public void onAddClick(View v) {
int origin=adv.getNumber();
origin++;
adv.setNumber(origin);
//设置子check为true
childBeen.get(groupPosition).get(childPosition).setChildCb(true);
childBeen.get(groupPosition).get(childPosition).setNum(origin);
Log.e("TAG",origin+"");
notifyDataSetChanged();
moneyview.isCheck(childBeen);
}
@Override
public void onDelClick(View v) {
int origin=adv.getNumber();
origin--;
adv.setNumber(origin);
//设置子check为true
childBeen.get(groupPosition).get(childPosition).setChildCb(true);
childBeen.get(groupPosition).get(childPosition).setNum(origin);
notifyDataSetChanged();
moneyview.isCheck(childBeen);
}
});
shop_title.setText(childBeen.get(groupPosition).get(childPosition).getTitle());
String images = childBeen.get(groupPosition).get(childPosition).getImages();
Glide.with(context).load(images).into(shop_img);
shop_price.setText(childBeen.get(groupPosition).get(childPosition).getPrice()+"");
childCheck.setChecked(childBeen.get(groupPosition).get(childPosition).isChildCb());
//子级别的点击事件都点完之后 父级别根着动
childCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//得到子类里状态值
boolean childCb = childBeen.get(groupPosition).get(childPosition).isChildCb();
if(childCb){
childBeen.get(groupPosition).get(childPosition).setChildCb(false);
}else{
childBeen.get(groupPosition).get(childPosition).setChildCb(true);
}
//写一个变量值用来判断
Boolean A=true;
//遍历子集合
List<ChildBean> childBeen1 = childBeen.get(groupPosition);
for (int i=0;i<childBeen1.size();i++){
//判断子级别中有没有false
if(childBeen1.get(i).isChildCb()==false){
A=false;
}
}
//如果为true 子级别全选
if(A){
//设置父级别的选择框
groupBeen.get(groupPosition).setGropuCb(true);
}else{
groupBeen.get(groupPosition).setGropuCb(false);
}
notifyDataSetChanged();
//子级别的全选按钮的判断设置
MainActivity tag= (MainActivity) context;
CheckBox checkAll= (CheckBox) tag.findViewById(R.id.all_chekbox);
//设置一个初始的boolean值 用来判断
Boolean B=true;
//遍历父集合
for(int x=0;x<childBeen.size();x++){
List<ChildBean> childBeen = ExpandableAdapter.this.childBeen.get(x);
for(int j=0;j<childBeen.size();j++){
boolean childCb1 = childBeen.get(j).isChildCb();
if(childCb1!=true){
B=false;
break;
}
}
}
//设置全选按钮
checkAll.setChecked(B);
moneyview.isCheck(childBeen);
}
});
return view;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
////////////////////////////////////////自定义View的代码
package com.example.gshopping;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* Created by on 2017/11/21.
* 自定义View的加减号
*/
public class AddDeleteView extends LinearLayout {
//设置接口回调
private OnAddDelClickListener Listener;
private TextView etNumber;
public interface OnAddDelClickListener{
void onAddClick(View v);
void onDelClick(View v);
}
//接口对象
public void setOnAddDelClickListener(OnAddDelClickListener Listener){
if (Listener!=null){
this.Listener=Listener;
}
}
public AddDeleteView(Context context) {
this(context,null);
}
public AddDeleteView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AddDeleteView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//加载布局
View view = View.inflate(context, R.layout.zidingyiview, this);
//获得主键
TextView txtDelete = (TextView) findViewById(R.id.txt_delete);
TextView txtAdd = (TextView) findViewById(R.id.txt_add);
etNumber = (TextView) findViewById(R.id.et_number);
//点击事件
txtAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Listener.onAddClick(AddDeleteView.this);
}
});
txtDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Listener.onDelClick(AddDeleteView.this);
}
});
}
//对外提供设置EditText值得方法
public void setNumber(int number){
if (number>0){
etNumber.setText(number+"");
}
}
public int getNumber(){
int number=0;
try {
String trim = etNumber.getText().toString().trim();
number = Integer.valueOf(trim);
}catch (Exception e){
number=0;
}
return number;
}
}
//默认展开
for (int i = 0; i< expandableAdapter.getGroupCount(); i++){
exlv.expandGroup(i);
}