您的位置:首页 > 移动开发 > Android开发

android 二级列表实现购物车

2017-11-22 09:38 501 查看
我把购物车写在了fragment里面  INewView是一个接口,懂MVP的应该都知道
public class CarFragment extends Fragment implements INewView{

private View view;
private ExpandableListView exListView;
public CheckBox allCheckbox;
private TextView totalPrice;
private TextView totalnumber;
private FZP presenter;
private ExpandableAdapter expandableAdapter;
//一级列表的List集合
List<GroupBean> groupBeen=new ArrayList<>();
//二级列表的List集合
List<List<ChildBean>> childBeen=new ArrayList<>();
private TextView tvEdit;
private boolean flagedit =true;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

view = inflater.inflate(R.layout.car_fragment,container, false);

initView();
//这里是封装的一个P层,图省事 P层不建议封装使用,毕竟我们用MVP是为了解耦
presenter = new FZP();
presenter.attachView(this);
return view;
}

private void initView(){
exListView = (ExpandableListView) view.findViewById(R.id.exListView);
allCheckbox = (CheckBox)view.findViewById(R.id.all_chekbox);
totalPrice = (TextView)view.findViewById(R.id.total_price);
totalnumber = (TextView)view.findViewById(R.id.total_number);
tvEdit = view.findViewById(R.id.edit);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Map<String,String> map = new HashMap<>();
presenter.get("http://120.27.23.105/product/getCarts?uid=100",map,"car",ShopCarBean.class);

//获取二级列表适配器
expandableAdapter = new ExpandableAdapter();
exListView.setAdapter(expandableAdapter);

for(int i = 0; i < expandableAdapter.getGroupCount(); i++){

exListView.expandGroup(i);

}

exListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
return true;
}
});

//全选监听
allCheckbox.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View view) {
boolean checked = allCheckbox.isChecked();
//改变一级item复选框
for (GroupBean i:groupBeen){
i.setGropuCb(checked);
}
//改变二级item复选框
for (List<ChildBean> i1:childBeen){
for(int r=0;r<i1.size();r++) {
i1.get(r).setChildCb(checked);
}
}
expandableAdapter.notifyDataSetChanged();
changesum(childBeen);
//Toast.makeText(Main2Activity.this,"全选按钮"+checked,Toast.LENGTH_SHORT).show();
}
});

tvEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String trim = tvEdit.getText().toString().trim();
if(trim.equals("编辑")){
tvEdit.setText("完成");

}else{
tvEdit.setText("编辑");
}

for (List<ChildBean> i1:childBeen){
for(int r=0;r<i1.size();r++) {
//
i1.get(r).setBtn(flagedit);
}
}
flagedit=!flagedit;
expandableAdapter.notifyDataSetChanged();

}

});

}

@Override
public void success(String tag, Object o) {
if(o!=null&&tag.equals("car")){
//请求回的数据进行强转
ShopCarBean shopCarBean= (ShopCarBean) o;
//得到我么所需要的数据
List<ShopCarBean.DataBean> data = shopCarBean.getData();
//遍历
for (ShopCarBean.DataBean i:data){
//给一级列表Bean添加数据
GroupBean groupBean = new GroupBean(i.getSellerName(), false);
//一级列表List集合添加数据
this.groupBeen.add(groupBean);

//获得我们二级列表需要的数据
List<ShopCarBean.DataBean.ListBean> list = i.getList();
//创建一个二级列表List集合
List<ChildBean> ls=new ArrayList<>();
//遍历
for (ShopCarBean.DataBean.ListBean w:list){
//图片地址需要拆分
String[] split = w.getImages().split("\\|");
//给二级列表Bean类赋值
ChildBean childBean = new ChildBean(w.getTitle(), split[0], w.getPrice(), 1, false,false);

//放入我们创建的二级列表List集合
ls.add(childBean);
}
//把整个二级列表List集合添加给我们的二级List
this.childBeen.add(ls);

}
//展开
for(int i = 0; i < expandableAdapter.getGroupCount(); i++){
exListView.expandGroup(i);
}
//刷新适配器
expandableAdapter.notifyDataSetChanged();

}
}

@Override
public void failed(String tag, String e) {
Toast.makeText(getActivity(),e+"",Toast.LENGTH_SHORT).show();
}
DecimalFormat df  = new DecimalFormat("######0.00");

//计算和数量总价
public void changesum(List<List<ChildBean>> childBeen){
int count=0;
double sum=0;
for (List<ChildBean> i1:childBeen){
for(int r=0;r<i1.size();r++) {
boolean childCb1 = i1.get(r).isChildCb();
if(childCb1){
double price = i1.get(r).getPrice();
int num = i1.get(r).getNum();
sum+=price*num;
count++;
}
}
}

totalPrice.setText("¥"+df.format(sum));
totalnumber.setText("共有商品:"+count+"件");
}


这里是适配器 我们需要传过来三个参数 一个是上下文 还有两个List集合,如果二级列表是在fragment里面需要多传一个Fragment
这里我没有传参是因为我把适配器写成内部类了
public class ExpandableAdapter extends BaseExpandableListAdapter {

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

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

@Override
public Object getGroup(int i) {
return groupBeen.get(i).getSellerName();
}

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

@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) {
//加载视图
view=View.inflate(getActivity(), R.layout.ex_group_item ,null);
//获得一级列表复选框
final CheckBox groupCb= view.findViewById(R.id.group_checkbox);
TextView shopName= view.findViewById(R.id.shop_name);

shopName.setText(groupBeen.get(i).getSellerName());
//给一级列表复选框设置选中状态
groupCb.setChecked(groupBeen.get(i).isGropuCb());

//组复选按钮
groupCb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获得一级列表复选框当前状态
boolean gchecked = groupCb.isChecked();
//把一级列表当前的选中状态存到一级列表List集合里面
groupBeen.get(i).setGropuCb(gchecked);
//循环遍历一级列表的Bean类
for(GroupBean i: groupBeen){
//获得Bean类中的状态
boolean gropuCb = i.isGropuCb();
//取反   如果取出的状态是true改为false 如果是false改为true
if(!gropuCb){
allCheckbox.setChecked(false);
//状态设为false跳出循环
break;
}else{
allCheckbox.setChecked(true);
}
}
//二级列表当前Bean类的长度
int size = childBeen.get(i).size();
//一级列表复选框当前状态如果为true,就把当前所有的二级列表里面全设置为true
if(gchecked){
//用当前二级列表的Bean类长度循环设置状态
for(int r=0;r<size;r++){

childBeen.get(i).get(r).setChildCb(true);
}
}else{ //一级列表复选框当前状态如果为false,就把当前所有的二级列表里面全设置为false

//用当前二级列表的Bean类长度循环设置状态
for(int r=0;r<size;r++){

childBeen.get(i).get(r).setChildCb(false);
}
}
//刷新适配器
notifyDataSetChanged();
//计算价格的方法,把二级列表的List集合传过去
changesum(childBeen);
}
});
return view;
}

//二级组
@Override
public View getChildView(final int i, final int i1, boolean b, View v, ViewGroup viewGroup) {
//加载视图
v=View.inflate(getActivity(), R.layout.ex_child_item ,null);
//获得二级列表的复选框
final CheckBox childCb = v.findViewById(R.id.child_checkbox);
TextView shopTitle= v.findViewById(R.id.shop_title);
TextView shopPrice= v.findViewById(R.id.shop_price);
ImageView shopImg=v.findViewById(R.id.shop_img);

//获取自定义加减器
final AddDeleteView adv = v.findViewById(R.id.adv);
Button shop_delete=v.findViewById(R.id.shop_delete);
//控制删除按钮的显隐
if(childBeen.get(i).get(i1).isBtn()){
shop_delete.setVisibility(View.VISIBLE);
}else{
shop_delete.setVisibility(View.INVISIBLE);
}
//删除按钮监听
shop_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int size = childBeen.get(i).size();
if (size == 1) {
childBeen.remove(i);
groupBeen.remove(i);
} else {
childBeen.get(i).remove(i1);
}
notifyDataSetChanged();
changesum(childBeen);
}
});

//通过二级列表的List集合取出状态,给二级列表的复选框设置状态
childCb.setChecked(childBeen.get(i).get(i1).isChildCb());

Glide.with(getActivity()).load(childBeen.get(i).get(i1).getImages()).into(shopImg);
shopTitle.setText(childBeen.get(i).get(i1).getTitle());
shopPrice.setText(childBeen.get(i).get(i1).getPrice()+"");
//调用自定义加减器里的方法设置Number
adv.setNumber(childBeen.get(i).get(i1).getNum());

//自定义加减器里的接口 加和减
adv.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {
@Override//加
public void onAddClick(View v) {
int number = adv.getNumber();
number++;
adv.setNumber(number);
childBeen.get(i).get(i1).setNum(number);
changesum(childBeen);
}

@Override//减
public void onDelClick(View v) {
int number = adv.getNumber();
number--;
adv.setNumber(number);
childBeen.get(i).get(i1).setNum(number);
changesum(childBeen);
}
});

//二级组的复选框监听
childCb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//定义一个默认flag
boolean flag=false;
//获得当前二级列表复选框的状态
boolean cchecked = childCb.isChecked();
//把当前状态存储到二级列表List集合里面
childBeen.get(i).get(i1).setChildCb(cchecked);

//循环遍历二级列表List集合
for (List<ChildBean> i1:childBeen){
// 按照所有二级列表的item的个数进行循环遍历
for(int r=0;r<i1.size();r++) {
//获取当前二级列表的状态
boolean childCb1 = i1.get(r).isChildCb();
//取反设置 如果为true改为false 如果为false改为true
if(!childCb1){
//如果当前二级列表中有一条复选框是false  全选为false
allCheckbox.setChecked(false);
//如果当前二级列表中有一条复选框是false  一级列表为false
groupBeen.get(i).setGropuCb(false);

//flag为true跳出循环
flag=true;
break;
}else{
//如果所有的二级列表都为true  全选为true
allCheckbox.setChecked(true);
//如果所有的二级列表都为true  一级列表为true
groupBeen.get(i).setGropuCb(true);
}
}
//falg为true时跳出循环
if(flag){
break;
}
}
//当前二级列表的总长度
int size = childBeen.get(i).size();
//按照当前二级列表的总长度循环
for(int x=0;x<size;x++) {
//获得当前二级列表中每一个item的选中状态
boolean childCb1 = childBeen.get(i).get(x).isChildCb();
//判断
if(!childCb1){
//有一个flase 一级列表就设置false  跳出循环
groupBeen.get(i).setGropuCb(false);
break;
}else{

groupBeen.get(i).setGropuCb(true);
}
}
//刷新适配器
notifyDataSetChanged();
//计算价格
changesum(childBeen);
}
});

return v;
}

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



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: