购物车二级列表
2017-11-21 19:33
387 查看
//依赖
//权限
activity_main
——————————————————————————————————————————————————————————————————————————————————————————————
//ex_group组的布局
**************************
bean包
大bean
1,GoodsBean类
2.GoodsGroup类
3.GoodsChilde类
MainActivity类
GoodsViews接口
presenter包
¥¥¥¥Presentrt类
adapter包
##########Goods类
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; } }
相关文章推荐
- RecyclerView 购物车 二级列表
- 二级列表购物车!!复制可用C+V
- 二级列表购物车
- MVP实现购物车(二级列表),删除结算功能,拦截器+封装okHttp
- 购物车的二级列表适配器
- 使用ExpandListView二级列表实现购物车
- 购物车二级列表
- 二级列表RecyclerView购物车
- 二级列表 购物车
- android 二级列表实现购物车
- RecyclerView条目跳转+SpringView数据刷新加载+MVP+OKhttp+拦截器+自定义view 实现请求网络数据的二级列表购物车
- 购物车二级列表(+-) 加删除
- 购物车(二级列表)
- 二级列表购物车
- Android购物车的功能实现(二级列表)
- 二级列表购物车
- 二级列表实现购物车的效果
- Android——二级列表实现购物车
- AndoridMVP二级列表购物车
- 购物车+MVP+二级列表