您的位置:首页 > 其它

购物车二级列表

2017-11-21 19:33 387 查看
//依赖

compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.github.bumptech.glide:glide:3.7.0'


//权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>


activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<!--头布局-->
<LinearLayout
android:id="@+id/top_bar"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#f7f7f7"
android:orientation="vertical" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@android:color/transparent"
android:orientation="vertical" >

<ImageView
android:id="@+id/back"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_gravity="center_vertical"
android:padding="12dp"
android:src="@drawable/back" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="48dp"
android:text="购物车"
android:textColor="#1a1a1a"
android:textSize="16sp" />

<TextView
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_he
20000
ight="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="40dp"
android:gravity="center"
android:minHeight="48dp"
android:text="编辑"
android:textColor="#1a1a1a"
android:textSize="14sp" />
</RelativeLayout>
</LinearLayout>

<ExpandableListView
android:id="@+id/exListView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:childIndicator="@null"
android:groupIndicator="@null" >
</ExpandableListView>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:orientation="horizontal" >

<CheckBox
android:id="@+id/all_chekbox"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"/>
<LinearLayout
android:id="@+id/ll_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginRight="20dp"
android:layout_weight="1"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="right"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="合计:"
android:textSize="18sp"
android:textStyle="bold" />

<TextView
android:id="@+id/total_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥0.00"
android:textColor="#f23232"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/total_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="共有商品:0件"
android:gravity="right"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/tv_go_to_pay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="#fd7a05"
android:clickable="true"
android:gravity="center"
android:text="结算"
android:textColor="#FAFAFA"

/>
</LinearLayout>

</LinearLayout>
</LinearLayout>

//layout_add_delete自定义view的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="1">

<TextView
android:id="@+id/txt_delete"
android:layout_width="30dp"
android:layout_height="30dp"
android:text="-"
android:gravity="center"
android:background="#8b948b"/>

<EditText
android:id="@+id/et_number"
android:layout_marginTop="2dp"
android:layout_width="50dp"
android:layout_height="30dp"
android:background="@drawable/edit"
android:layout_weight="0.00"
android:gravity="center"
android:text="1"/>
<TextView
android:id="@+id/txt_add"
android:layout_width="30dp"
android:layout_height="30dp"
android:text="+"
android:gravity="center"
android:background="#8b948b"/>

</LinearLayout>
——————————————————————————————————————————————————————————————————————————————————————————————
drawable下的edit控件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<!--<corners android:radius="3dip"/>-->
<stroke
android:width="1dip"
android:color="#BDC7D8" />
</shape>

——————————————————————————————————————————————————————————————————————————————————————————————

//ex_group组的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cfc3c3"
android:orientation="horizontal">

<CheckBox
android:id="@+id/group_checkbox"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"/>

<TextView
android:id="@+id/shop_name"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp" />

</LinearLayout>

//ex_child_item子条目的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="230dp"
android:orientation="horizontal">

<CheckBox
android:id="@+id/child_checkbox"
android:layout_marginTop="50dp"
android:layout_marginLeft="20dp"
android:layout_marginBottom="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<RelativeLayout
android:layout_marginLeft="20dp"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/shop_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="17dp"
android:layout_marginStart="17dp"
android:text="TextView"
android:layout_alignParentTop="true" />

<ImageView
android:id="@+id/shop_img"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginTop="30dp"
app:srcCompat="@mipmap/ic_launcher"
android:layout_below="@+id/shop_name"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<TextView
android:id="@+id/shop_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/shop_img"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:text="¥20"
android:textColor="#f23232"/>

<com.bwei.my.myview.AddDeleteView
android:id="@+id/adv"
android:layout_width="160dp"
android:layout_height="30dp"
android:layout_below="@+id/shop_price"
android:layout_marginTop="30dp"
android:layout_marginLeft="140dp"
app:left_text="-"
app:right_text="+"
app:middle_text="1"
android:focusable="false"
>

</com.bwei.my.myview.AddDeleteView>

<Button
android:id="@+id/shop_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"

android:text="删除" />
</RelativeLayout>

</LinearLayout>

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
myview层
自定义view类
AddDeleteView类
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bwei.my.R;

/**
* 作者
* on 2017/11/18 10:49
*/

public class AddDeleteView extends LinearLayout {
private OnAddDelClickListener listener;
private EditText 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, AttributeSet attrs) {
this(context, attrs,0);
}

public AddDeleteView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs, defStyleAttr);
}

private void initView(Context context, AttributeSet attrs, int defStyleAttr) {
View.inflate(context, R.layout.layout_add_delete,this);

//获取控件
TextView txtDelete=findViewById(R.id.txt_delete);
TextView txtAdd=findViewById(R.id.txt_add);
etNumber = findViewById(R.id.et_number);

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AddDeleteViewStyle);

String leftText = typedArray.getString(R.styleable.AddDeleteViewStyle_left_text);
String rightText = typedArray.getString(R.styleable.AddDeleteViewStyle_right_text);
String middleText = typedArray.getString(R.styleable.AddDeleteViewStyle_middle_text);
int color = typedArray.getColor(R.styleable.AddDeleteViewStyle_left_text_color, Color.BLACK);

txtDelete.setText(leftText);
txtAdd.setText(rightText);
etNumber.setText(middleText);
txtDelete.setTextColor(color);

//回收
typedArray.recycle();

txtDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.onDelClick(view);
}
});

txtAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.onAddClick(view);
}
});

}
//对外提供一个修改数字的方法
public void setNumber(int number){
if(number>0){
etNumber.setText(number+"");
}
}
//对外提供一个获取当前数字的方法
public int getNumber(){
String string = etNumber.getText().toString();
int i = Integer.parseInt(string);
return i;
}

}

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

***************values下的attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="AddDeleteViewStyle">
<attr name="left_text" format="string"></attr>
<attr name="right_text" format="string"></attr>
<attr name="middle_text" format="string"></attr>
<attr name="left_text_color" format="color"></attr>
</declare-styleable>
</resources>

**************************

 bean包

大bean
1,GoodsBean类
2.GoodsGroup类

public class GoodsGroup {
private boolean checkbox;
private String grouptitle;

public GoodsGroup(boolean checkbox, String grouptitle) {
this.checkbox = checkbox;
this.grouptitle = grouptitle;
}

public boolean isCheckbox() {
return checkbox;
}

public void setCheckbox(boolean checkbox) {
this.checkbox = checkbox;
}

public String getGrouptitle() {
return grouptitle;
}

public void setGrouptitle(String grouptitle) {
this.grouptitle = grouptitle;
}

@Override
public String toString() {
return "GoodsGroup{" +
"checkbox=" + checkbox +
", grouptitle='" + grouptitle + '\'' +
'}';
}
}

3.GoodsChilde类

public class GoodsChilde {

private String childTitle;
private boolean checkchild;
private String img;
private double price;
private int num;
private boolean btn;

public GoodsChilde(String childTitle, boolean checkchild, String img, double price, int num, boolean btn) {
this.childTitle = childTitle;
this.checkchild = checkchild;
this.img = img;
this.price = price;
this.num = num;
this.btn = btn;
}

public String getChildTitle() {
return childTitle;
}

public void setChildTitle(String childTitle) {
this.childTitle = childTitle;
}

public boolean isCheckchild() {
return checkchild;
}

public void setCheckchild(boolean checkchild) {
this.checkchild = checkchild;
}

public String getImg() {
return img;
}

public void setImg(String img) {
this.img = img;
}

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 isBtn() {
return btn;
}

public void setBtn(boolean btn) {
this.btn = btn;
}

@Override
public String toString() {
return "GoodsChilde{" +
"childTitle='" + childTitle + '\'' +
", checkchild=" + checkchild +
", img='" + img + '\'' +
", price=" + price +
", num=" + num +
", btn=" + btn +
'}';
}
}


MainActivity类

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

import com.bwei.my.adapter.Goods;
import com.bwei.my.bean.GoodsChilde;
import com.bwei.my.bean.GoodsGroup;
import com.bwei.my.model.GoodsViews;
import com.bwei.my.presenter.PresenterTwo;

import java.util.ArrayList;
import java.util.List;

import static android.widget.Toast.LENGTH_SHORT;

public class Main2Activity extends AppCompatActivity implements GoodsViews {

private ExpandableListView exListView;//
public CheckBox all_checKbox;
private TextView total_price;
private TextView total_number;
private TextView pay;
//新建两个集合
List<GoodsGroup> list=new ArrayList<GoodsGroup>();
List<List<GoodsChilde>> list2=new ArrayList<List<GoodsChilde>>();
private PresenterTwo two;
private Goods goods;
private TextView edit;

private boolean flagg=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//获取控件,获取完直接去p层解析数据
exListView = (ExpandableListView) findViewById(R.id.exListView);
all_checKbox = (CheckBox) findViewById(R.id.all_chekbox);
total_price = (TextView) findViewById(R.id.total_price);
total_number = (TextView) findViewById(R.id.total_number);
pay = (TextView) findViewById(R.id.tv_go_to_pay);
edit = (TextView) findViewById(R.id.edit);

//实例化p层
two = new PresenterTwo(Main2Activity.this, this, list, list2);
two.Goods();

//全选按钮的点击事件
all_checKbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获取到全选按钮的状态
boolean checked = all_checKbox.isChecked();
for (GoodsGroup i : list) {
//把状态赋给父级
i.setCheckbox(checked);
}
//子级的状态
for (List<GoodsChilde> i1 : list2) {
for (int j = 0; j < i1.size(); j++) {
i1.get(j).setCheckchild(checked);
}
}
//刷新适配器
goods.notifyDataSetChanged();
//计算的方法
changesum(list2);
}

});
//删除条目的逻辑
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//遍历子级的集合
for (List<GoodsChilde> i1:list2){
for (int i=0;i<i1.size();i++){
i1.get(i).setBtn(flagg);
}
}
flagg=!flagg;
goods.notifyDataSetChanged();
}
});

}
//计算的逻辑
public void changesum(List<List<GoodsChilde>> childBeen) {
double sum = 0;
int count = 0;
for (List<GoodsChilde> i1 : childBeen) {
for (int r = 0; r < i1.size(); r++) {
boolean childCb1 = i1.get(r).isCheckchild();
if (childCb1) {
double price = i1.get(r).getPrice();
int num = i1.get(r).getNum();
sum += num * price;
count+=num;
}
}
}
total_price.setText("¥:" + sum);
total_number.setText("共计有"+count+"件商品");

}

@Override
public void onSuccess(List<GoodsGroup> list, List<List<GoodsChilde>> list2) {
//创建适配器
goods = new Goods(this,list,list2);
//设置适配器
exListView.setAdapter(goods);
//二级列表默认展开
for (int i = 0; i< goods.getGroupCount(); i++){
exListView.expandGroup(i);
}
//刷新适配器
goods.notifyDataSetChanged();

}

@Override
public void onFiled(Exception e) {
Log.e("ttt","和琪是猪");

}
}

 model包

HttpUtils
import android.os.Handler;
import android.util.Log;

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;

/**
* Created by 壹颗大金星 on 2017/11/9.
*/

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,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.Builder().build();
//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);
}
});
}
//请求成功
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.e("TAG",result.toString());
//拿到数据解析
final Object o = new Gson().fromJson(result, c);
Log.i("hhh", o+"");
//当前是在子线程,回到主线程中
handler.post(new Runnable() {
@Override
public void run() {
//回调
callBack.onSuccess("hh",o);
}
});
}
});

}
//post请求
public void post(String url, Map<String,String> map, final CallBack callBack, final Class c,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);
}
});
}
//请求成功
@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("hh",o);
}
});
}
});
}

}

CallBack接口
public interface CallBack {

void onSuccess(String tag,Object o);

void onFailed(Exception e);
}
 

GoodsViews接口

import com.bwei.my.bean.GoodsChilde;
import com.bwei.my.bean.GoodsGroup;
import com.bwei.my.bean.ImgBean;

import java.util.List;

/**
* Created by HQ on 2017/11/21.
*/

public interface GoodsViews {
void onSuccess( List<GoodsGroup> list, List<List<GoodsChilde>> list2);
void onFiled( Exception e);
}


import com.bwei.my.bean.ImgBean;

import java.util.ArrayList;
import java.util.List;

/**
* Created by HQ on 2017/11/14.
*/
一般是这个接口
 public interface Iv {
void onSuccess(List<ImgBean> list);
void onFiled( Exception e);
}


presenter包

¥¥¥¥Presentrt类

import android.content.Context;
import android.util.Log;

import com.bwei.my.bean.GoodsBean;
import com.bwei.my.bean.GoodsChilde;
import com.bwei.my.bean.GoodsGroup;
import com.bwei.my.model.CallBack;
import com.bwei.my.model.GoodsViews;
import com.bwei.my.model.HttpUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
* Created by HQ on 2017/11/21.
*/

public class PresenterTwo {
private Context context;
private GoodsViews goodsViews;
//定义两个集合,去写bean类
private List<GoodsGroup> list;//给父级的集合不new出来、
private List<List<GoodsChilde>> list2;//给子级的集合

//有参构造
public PresenterTwo(Context context, GoodsViews goodsViews, List<GoodsGroup> list, List<List<GoodsChilde>> list2) {
this.context = context;
this.goodsViews = goodsViews;
this.list = list;
this.list2 = list2;
}

//方法
public void Goods(){
HashMap<String, String> map = new HashMap<>();
HttpUtils.getInstance().post("http://120.27.23.105/product/getCarts?uid=100", map, new CallBack() {
@Override
public void onSuccess(String tag, Object o) {
//解析父级集合
GoodsBean bean = (GoodsBean) o;
List<GoodsBean.DataBean> data = bean.getData();
for (int i=0;i<data.size();i++){
String sellerName = data.get(i).getSellerName();
list.add(new GoodsGroup(false,sellerName));
//解析子集集合
List<GoodsBean.DataBean.ListBean> lists = data.get(i).getList();
//因为集合里面套集合,要放一个集合,所以新new一个集合,是子集
List<GoodsChilde> list1=new ArrayList<GoodsChilde>();
for (int j=0;j<lists.size();j++){
String title = lists.get(j).getTitle();
String images = lists.get(j).getImages();
double price = lists.get(j).getBargainPrice();
list1.add(new GoodsChilde(title,false,images,price,1,false));
}
list2.add(list1);
Log.e("hhh", list2.toString());
}
//通过新建的view接口,传给mainActivity
goodsViews.onSuccess(list,list2);

}

@Override
public void onFailed(Exception e) {
goodsViews.onFiled(e);

}
},GoodsBean.class,"hh");
}
}

 adapter包

##########Goods类

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bwei.my.Main2Activity;
import com.bwei.my.R;
import com.bwei.my.bean.GoodsChilde;
import com.bwei.my.bean.GoodsGroup;
import com.bwei.my.myview.AddDeleteView;

import java.util.List;

/**
* Created by HQ on 2017/11/21.
*/

public class Goods extends BaseExpandableListAdapter {
private Context context;
//传过来两个集合
private List<GoodsGroup> list;
private List<List<GoodsChilde>> list2;
Main2Activity con;
//有参构造
public Goods(Context context, List<GoodsGroup> list, List<List<GoodsChilde>> list2) {
this.context = context;
this.list = list;
this.list2 = list2;
con=(Main2Activity)context;
}

@Override
public int getGroupCount() {
return list.size();
}

@Override
public int getChildrenCount(int i) {
return list2.get(i).size();
}

@Override
public Object getGroup(int i) {
return list.size();
}

@Override
public Object getChild(int i, int i1) {
return list2.get(i).get(i1).getChildTitle();
}

@Override
public long getGroupId(int i) {
return i;
}

@Override
public long getChildId(int i, int i1) {
return i1;
}

@Override
public boolean hasStableIds() {
return true;
}

//父级的展示
@Override
public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
final GroupViewHolder holder;
if(view==null){
holder=new GroupViewHolder();
//绘制父级视图
view=View.inflate(context, R.layout.ex_group_item,null);
holder.cb=(CheckBox)view.findViewById(R.id.group_checkbox);
holder.name=(TextView)view.findViewById(R.id.shop_name);

view.setTag(holder);

}else{
holder=(GroupViewHolder)view.getTag();
}
//设置父级的选中状态
holder.cb.setChecked(list.get(i).isCheckbox());
//得到名字
holder.name.setText(list.get(i).getGrouptitle());
//设置父级选择框的点击事件
holder.cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//父级当前框的选择状态,默认为未选中
boolean checked = holder.cb.isChecked();
//设置显示
list.get(i).setCheckbox(checked);
Main2Activity con=(Main2Activity)context;//获取到Main2Activity
//遍历父级的集合
for (GoodsGroup ii:list){
boolean checkbox = ii.isCheckbox();
if(!checkbox){//如果父级没有勾选
con.all_checKbox.setChecked(false);//设置全选按钮也不勾选
break;
}else{
con.all_checKbox.setChecked(true);
}
}
//勾选执行计算的方法
con.changesum(list2);
notifyDataSetChanged();
//获取到我们子级的集合长度
int size = list2.get(i).size();
//如果我们的父级全部被选中
if(checked){
//那么你就遍历子级的长度
for (int j=0;j<size;j++){
//将我们的子级全部都选中
list2.get(i).get(j).setCheckchild(true);
}
}else{
for (int j=0;j<size;j++){
list2.get(i).get(j).setCheckchild(false);
}
}
//刷新我们的适配器
con.changesum(list2);
notifyDataSetChanged();
}
});

return view;
}
//子级的展示
@Override
public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
final ChildViewHolder holder;
if(view==null){
holder=new ChildViewHolder();
//绘制子集视图
view=View.inflate(context, R.layout.ex_child_item,null);
holder.ch2=view.findViewById(R.id.child_checkbox);//子级的选择框
holder.title=view.findViewById(R.id.shop_title);//子级的标题
holder.img=view.findViewById(R.id.shop_img);//图片
holder.et_number=view.findViewById(R.id.et_number);//加减中间的数量
holder.price=view.findViewById(R.id.shop_price);//价格
holder.txt_delete=view.findViewById(R.id.txt_delete);//加减器的减
holder.txt_add=view.findViewById(R.id.txt_add);//加减器的加
holder.txt_delete.setText("-");//设置显示减号
holder.txt_add.setText("+");//设置显示加号
holder.jiajia=view.findViewById(R.id.adv);//设置显示加减器
holder.jiajia.setNumber(list2.get(i).get(i1).getNum());//自定义view修改数字的方法
holder.btn=view.findViewById(R.id.shop_delete);//删除的按钮
view.setTag(holder);
}else{
holder=(ChildViewHolder)view.getTag();
}
//执行删除的方法
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int size = list2.get(i).size();
if(size==1){
list2.remove(i);
list.remove(i);
}else{
list2.get(i).remove(i1);
}
//点击删除后隐藏所有删除按钮
for (List<GoodsChilde> i1:list2){
for(int r=0;r<i1.size();r++) {
i1.get(r).setBtn(false);
}
}
notifyDataSetChanged();
con.changesum(list2);
}
});
//必须要设置,不然点击加减会崩,加减的点击事件
holder.jiajia.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {
@Override
public void onAddClick(View v) {
int number = holder.jiajia.getNumber();
number++;
holder.jiajia.setNumber(number);
list2.get(i).get(i1).setNum(number);
con.changesum(list2);//计算的方法

}

@Override
public void onDelClick(View v) {
int number = holder.jiajia.getNumber();
number--;
holder.jiajia.setNumber(number);
list2.get(i).get(i1).setNum(number);
con.changesum(list2);

}
});

//子级的选择框
holder.ch2.setChecked(list2.get(i).get(i1).isCheckchild());
holder.title.setText(list2.get(i).get(i1).getChildTitle());
//图片路径拆分
String img = list2.get(i).get(i1).getImg();
String[] split = img.split("\\|");
Glide.with(context).load(split[0]).into(holder.img);
holder.price.setText(list2.get(i).get(i1).getPrice()+"");
//子级的选择框逻辑
holder.ch2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//定义一个flag用于跳出循环
boolean flag=false;
//获取我们子级的选中状态
boolean checked = holder.ch2.isChecked();
//将选中状态返回给我们存放子级的集合中
list2.get(i).get(i1).setCheckchild(checked);
//获取到Activity
Main2Activity con=(Main2Activity)context;
//循环我们的子级集合
for (List<GoodsChilde> i1:list2){
//循环第二层的集合
for (int j=0;j<i1.size();j++){
//获取到子级条目数的选中状态
boolean chokx = i1.get(j).isCheckchild();
//如果我们的子级条目有一条未被选中
if(!chokx){
//那么就让我们的全选按钮为未选中
con.all_checKbox.setChecked(false);
//同时将父级的按钮也变为未选中
list.get(i).setCheckbox(false);
//flag为true,跳出本层的循环
flag=true;
break;
}else{
con.all_checKbox.setChecked(true);
list.get(i).setCheckbox(true);
}
}
if (flag){
break;
}
}
con.changesum(list2);
//遍历每一个父级下面的子级集合判断
//获取到子级的集合长度
int size = list2.get(i).size();
//遍历子级集合
for (int e=0;e<size;e++){
//获取到子级的选中状态
boolean chokx = list2.get(i).get(e).isCheckchild();
//如果子级有一条未被选中
if(!chokx){
//那么我们的父级按钮就不会被选中
list.get(i).setCheckbox(false);
break;
}else{
list.get(i).setCheckbox(true);
}
}
notifyDataSetChanged();
con.changesum(list2);
}
});

//控制删除按钮的显隐
if(list2.get(i).get(i1).isBtn()){
holder.btn.setVisibility(View.VISIBLE);
}else{
holder.btn.setVisibility(View.INVISIBLE);
}
return view;
}

@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}

//两个ViewHolder内部类

class GroupViewHolder{
//控件
CheckBox cb;
TextView name;
}
class ChildViewHolder{
CheckBox ch2;
TextView title;
ImageView img;
TextView price;
TextView txt_delete;
TextView et_number;
TextView txt_add;
AddDeleteView jiajia;
Button btn;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: