activity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
ExpandableListView expandableListView;
Context context;
private CheckBox checkall;
private TextView allpay;
private TextView allprice;
private TextView allnum;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = MainActivity.this;
initView();
initData();
}
private void initView() {
expandableListView = findViewById(R.id.main_expand);
checkall = findViewById(R.id.main_check);
allnum = findViewById(R.id.main_numb);
allprice = findViewById(R.id.main_price);
allpay = findViewById(R.id.main_pay);
checkall.setOnClickListener(this);
}
private void initData() {
String url = "https://www.zhaoapi.cn/product/getCarts?uid=71";
new OkHttpClient.Builder().build().newCall(new Request.Builder().url(url).build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(final Call call, Response response) throws IOException {
final String responses = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
//解析数据
Gson gson = new Gson();
MyBean myBean = gson.fromJson(responses, MyBean.class);
List data = myBean.getData();
myAdapter = new MyAdapter(context, data);
expandableListView.setAdapter(myAdapter);
//把所有二级列表进行展开
for (int i = 0; i < data.size(); i++) {
expandableListView.expandGroup(i);
}
//适配器的接口回调
myAdapter.setOnChangeLinsenter(new MyAdapter.OnChangeLinsenter() {
@Override
public void shopChange(int i) {
boolean shop = myAdapter.isShop(i);
myAdapter.shopall(i, !shop);
myAdapter.notifyDataSetChanged();
refreshall();
}
@Override
public void goodChange(int i, int i1) {
myAdapter.goodselect(i, i1);
myAdapter.notifyDataSetChanged();
refreshall();
}
@Override
public void goodnumChange(int i, int i1, int num) {
myAdapter.numshange(i, i1, num);
myAdapter.notifyDataSetChanged();
refreshall();
}
});
}
});
}
});
}
@Override
public void onClick(View view) {
switch (view.getId()) {
//全选按钮的点击事件
case R.id.main_check:
//调用适配器的方法状态 并赋值
boolean allChecked = myAdapter.isAllChecked();
myAdapter.changeAll(!allChecked);
//刷新适配器
myAdapter.notifyDataSetChanged();
//调取刷新全选的方法
refreshall();
break;
}
}
//写一个方法 专门去进行 全选 所有数量 以及总价
private void refreshall() {
boolean allChecked = myAdapter.isAllChecked();
checkall.setChecked(allChecked);
double allprie = myAdapter.allPrice();
allprice.setText("总价为:¥" + allprie);
int snum = myAdapter.allNum();
allnum.setText("共" + snum + "件商品");
}
}
adapter
/**
* 适配器中
* 展示页面
* 做一些逻辑判断(通过接口回调)
*/
public class MyAdapter extends BaseExpandableListAdapter {
List data;
Context context;
public MyAdapter(Context context, List data) {
this.context = context;
this.data = data;
}
@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 null;
}
@Override
public Object getChild(int i, int i1) {
return null;
}
@Override
public long getGroupId(int i) {
return 0;
}
@Override
public long getChildId(int i, int i1) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
//设置外层-----商家
@Override
public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
//定义Holder
GroupViewHolder groupViewHolder = null;
if (view == null) {
groupViewHolder = new GroupViewHolder();
view = View.inflate(context, R.layout.grouplayout, null);
groupViewHolder.group_checkBox = view.findViewById(R.id.group_check);
groupViewHolder.group_textView = view.findViewById(R.id.group_name);
view.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) view.getTag();
}
//赋值商家名称
groupViewHolder.group_textView.setText(data.get(i).getSellerName());
//得到那个方法的状态并赋值给适配器的状态
boolean shop = isShop(i);
groupViewHolder.group_checkBox.setChecked(shop);
/**
* 通过点击事件 返回出接口
*/
groupViewHolder.group_checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onChangeLinsenter != null) {
onChangeLinsenter.shopChange(i);
}
}
});
return view;
}
//判断商家的选中状态 进行判断
public boolean isShop(int i) {
//遍历子条目 判断下面的商家状态
List list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getSelected() == 0) {
return false;
}
}
return true;
}
//设置子层-----商品
@Override
public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
ChildViewHolder childViewHolder = null;
if (view == null) {
childViewHolder = new ChildViewHolder();
view = View.inflate(context, R.layout.childlayout, null);
childViewHolder.child_checkBox = view.findViewById(R.id.child_check);
childViewHolder.child_image = view.findViewById(R.id.child_image);
childViewHolder.child_name = view.findViewById(R.id.child_name);
childViewHolder.child_price = view.findViewById(R.id.child_price);
childViewHolder.myView = view.findViewById(R.id.child_myview);
view.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) view.getTag();
}
childViewHolder.child_name.setText(data.get(i).getList().get(i1).getTitle());
double price = data.get(i).getList().get(i1).getPrice();
String prices = String.valueOf(price);
childViewHolder.child_price.setText("¥" + prices);
String images = data.get(i).getList().get(i1).getImages();
if (images.contains("|")) {
String[] split = images.split("\\|");
Picasso.with(context).load(split[0]).into(childViewHolder.child_image);
} else {
Picasso.with(context).load(images).into(childViewHolder.child_image);
}
//获取商品的判断状态并返回出去
List list = data.get(i).getList();
childViewHolder.child_checkBox.setChecked(list.get(i1).getSelected() == 1);
childViewHolder.child_checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onChangeLinsenter.goodChange(i, i1);
}
});
//这是 接口回调中的 数量照片
childViewHolder.myView.setOnNumChange(new MyView.onNumChange() {
@Override
public void onNumberChange(int number) {
onChangeLinsenter.goodnumChange(i, i1, number);
}
});
return view;
}
//在接口回调后商家使用的方法
public void shopall(int i, boolean b) {
List list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
list.get(j).setSelected(b ? 1 : 0);
}
}
//在接口回调后商品使用的方法
public void goodselect(int i, int i1) {
MyBean.DataBean.ListBean listBean = data.get(i).getList().get(i1);
listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0);
}
//在接口回调后数量改变使用的方法
public void numshange(int i, int i1, int number) {
MyBean.DataBean.ListBean listBean = data.get(i).getList().get(i1);
listBean.setNum(number);
}
//得到所有商品数量的方法
public int allNum() {
int numa = 0;
for (int i = 0; i < data.size(); i++) {
List list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getSelected() == 1) {
int num = list.get(j).getNum();
numa += num;
}
}
}
return numa;
}
//得到所有价格的方法
public double allPrice() {
double allpro = 0;
for (int i = 0; i < data.size(); i++) {
List list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getSelected() == 1) {
double price = list.get(j).getPrice();
int num = list.get(j).getNum();
allpro += price * num;
}
}
}
return allpro;
}
//判断全选按钮并设置对应的处理的方法
public boolean isAllChecked() {
for (int i = 0; i < data.size(); i++) {
List list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getSelected() == 0) {
return false;
}
}
}
return true;
}
//全局全选按钮状态改变之后调取的方法
public void changeAll(boolean b) {
for (int i = 0; i < data.size(); i++) {
List list = data.get(i).getList();
for (int j = 0; j < list.size(); j++) {
list.get(j).setSelected(b ? 1 : 0);
}
}
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
//设置外层ViewHolder
public static class GroupViewHolder {
CheckBox group_checkBox;
TextView group_textView;
}
//设置子层ViewHolder
public static class ChildViewHolder {
CheckBox child_checkBox;
TextView child_name, child_price;
ImageView child_image;
MyView myView;
}
OnChangeLinsenter onChangeLinsenter;
//设置对外层开放的方法 用于调取接口
public void setOnChangeLinsenter(OnChangeLinsenter onChangeLinsenter) {
this.onChangeLinsenter = onChangeLinsenter;
}
//设置接口 控制商家商品数量
public interface OnChangeLinsenter {
void shopChange(int i);
void goodChange(int i, int i1);
void goodnumChange(int i, int i1, int num);
}
}
自定义视图
//自定义加减器按钮
public class MyView extends LinearLayout implements View.OnClickListener {
TextView tv_sub_view;
TextView tv_number_view;
TextView tv_add_view;
private int number = 1;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
tv_number_view.setText(number + "");
}
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View inflate = LayoutInflater.from(context).inflate(R.layout.myviewlayout, this);
tv_sub_view = inflate.findViewById(R.id.dec);
tv_number_view = inflate.findViewById(R.id.num);
tv_add_view = inflate.findViewById(R.id.add);
//设置点击事件
tv_sub_view.setOnClickListener(this);
tv_add_view.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.dec:
if (number > 1) {
--number;
tv_number_view.setText(number + "");
if (onNumChange != null) {
onNumChange.onNumberChange(number);
}
} else {
Toast.makeText(getContext(), "不能小于1", Toast.LENGTH_SHORT).show();
}
break;
case R.id.add:
++number;
tv_number_view.setText(number + "");
if (onNumChange != null) {
onNumChange.onNumberChange(number);
}
break;
}
}
onNumChange onNumChange;
public void setOnNumChange(MyView.onNumChange onNumChange) {
this.onNumChange = onNumChange;
}
public interface onNumChange {
void onNumberChange(int number);
}
}
自定义view布局