//依赖
//Httpcompile 'com.facebook.fresco:webpsupport:0.12.0' compile 'com.youth.banner:banner:1.4.9' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.jakewharton:butterknife:8.8.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.github.bumptech.glide:glide:4.3.1' compile 'com.android.support:recyclerview-v7:26.+' compile 'com.facebook.fresco:fresco:1.2.0' compile 'com.facebook.fresco:animated-base-support:0.12.0' compile 'com.facebook.fresco:animated-gif:0.12.0' compile 'com.facebook.fresco:animated-webp:0.12.0' compile 'com.facebook.fresco:webpsupport:0.12.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'org.greenrobot:eventbus:3.1.1'android:theme="@style/Theme.AppCompat.Light.NoActionBar"> <!-- 隐藏标题栏 -->
public class RetrofitUtils { private static volatile RetrofitUtils instance; private final Retrofit retrofit; private RetrofitUtils(){ retrofit = new Retrofit.Builder() .baseUrl("http://120.27.23.105") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); Log.i("retroifit",retrofit+""); } public static RetrofitUtils getInstance(){ if(instance==null){ synchronized (RetrofitUtils.class){ if(instance==null){ instance=new RetrofitUtils(); } } } return instance; } public UtilsPost getApiservise(){ return retrofit.create(UtilsPost.class); } }
=======================================================================================
public interface UtilsPost { @GET("/product/getCarts") Flowable<DataBeans> getVideo2(@QueryMap Map<String, String> map); @GET("/product/deleteCart") Flowable<deletebean> getVideo(@QueryMap Map<String, String> map); }==========================================================================================
//model
public class Models implements ModelPost { private PlayPresenter playPresenter; public Models(PlayPresenter playPresenter) { this.playPresenter = playPresenter; } @Override public void getData(Map<String, String> map) { Flowable<DataBeans> video2 = RetrofitUtils.getInstance().getApiservise().getVideo2(map); Log.i("fff",video2+""); playPresenter.get2(video2); } }=============================================================================
public interface ModelPost { void getData(Map<String, String> map); }===============================================================================
//presenter
public class PlayPresenter implements PresenterPost { private Iview iview; private DisposableSubscriber<DataBeans> subscriber; private List<Goodsuser> list; private List<List<Goodsuser2>> list2; public PlayPresenter(Iview iview, List<Goodsuser> list, List<List<Goodsuser2>> list2) { this.iview = iview; this.list = list; this.list2 = list2; } @Override public void getData2(Map<String, String> map) { Models model = new Models(this); Log.i("mmm",map+""); model.getData(map); }==================================================================================//绑定 public void detachView() { if (iview != null) { iview = null; } if (disposableSubscriber != null) { if (!disposableSubscriber.isDisposed()) { disposableSubscriber.dispose(); } } }public void get2(Flowable<DataBeans> getVideo){ subscriber= getVideo.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSubscriber<DataBeans>() { @Override public void onNext(DataBeans retBean2) { if(retBean2!=null){ List<DataBeans.DataBean> data = retBean2.getData(); for (int i=0;i<data.size();i++){ String sellerName = data.get(i).getSellerName(); list.add(new Goodsuser(false,sellerName)); List<DataBeans.DataBean.ListBean> list = data.get(i).getList(); List<Goodsuser2> list1=new ArrayList<Goodsuser2>(); for (int j = 0; j<list.size(); j++){ String title = list.get(j).getTitle(); String images = list.get(j).getImages(); double price = list.get(j).getPrice(); int pid = list.get(j).getPid(); list1.add(new Goodsuser2(title,images,price,1,false,pid)); } list2.add(list1); } } iview.onSuccess2(list,list2); } @Override public void onError(Throwable t) { iview.onFailed2(new Exception(t)); } @Override public void onComplete() { } }); }}
public interface PresenterPost { void getData2(Map<String, String> map); }=====================================================================================
//加减器
public class AddDleneteView extends LinearLayout { private OnAddDelClickListener listener; public 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 AddDleneteView(Context context) { this(context,null); } public AddDleneteView(Context context, AttributeSet attrs) { this(context, attrs,0); } public AddDleneteView(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_tiem,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.AddDleneteView_left_text); String rightText = typedArray.getString(R.styleable.AddDleneteView_right_text); String middleText = typedArray.getString(R.styleable.AddDleneteView_middle_text); int color = typedArray.getColor(R.styleable.AddDleneteView_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; } } ==================================================================================public interface Iview { void onSuccess2(List<Goodsuser> list, List<List<Goodsuser2>> list2); void onFailed2(Exception e); }
//attrs
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AddDleneteView"> <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> <declare-styleable name="AddDeleteViewStyle"></declare-styleable> </resources>===============================================================================
//加减器布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/txt_delete" android:layout_width="30dp" android:layout_height="30dp" android:text="-" android:gravity="center" android:background="#e4a022"/> <EditText android:id="@+id/et_number" android:layout_marginTop="2dp" android:layout_width="50dp" android:layout_height="30dp" android:background="#f2efef" android:gravity="center" android:text="1" android:inputType="number" /> <TextView android:id="@+id/txt_add" android:layout_width="30dp" android:layout_height="30dp" android:text="+" android:gravity="center" android:background="#d59216"/> </LinearLayout>===================
<bwei.com.shopingcart.view.AddDleneteView android:id="@+id/adv" android:layout_width="160dp" android:layout_height="30dp" android:layout_marginTop="30dp" android:layout_marginLeft="140dp" app:left_text="-" app:right_text="+" app:middle_text="1" android:focusable="false" ></bwei.com.shopingcart.view.AddDleneteView>==================================================================
//Adapater
public class Goods extends BaseExpandableListAdapter { private Context context; private List<Goodsuser> list; private List<List<Goodsuser2>> list2; MainActivity con; public Goods(Context context, List<Goodsuser> list, List<List<Goodsuser2>> list2) { this.context = context; this.list = list; this.list2 = list2; con= (MainActivity) 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.get(i); } @Override public Object getChild(int i, int i1) { return list2.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 position, boolean b, View view, ViewGroup viewGroup) { final GroupViewHolder holder; if(view==null){ holder = new GroupViewHolder(); view=view.inflate(context, R.layout.layout_suer,null); holder.cb=(CheckBox)view.findViewById(R.id.cb1); holder.tv=(TextView)view.findViewById(R.id.titles); view.setTag(holder); }else{ holder=(GroupViewHolder)view.getTag(); } holder.cb.setChecked(list.get(position).isCb1()); holder.tv.setText(list.get(position).getName()); holder.cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //首先获取到父级的选中状态 boolean checked1 = holder.cb.isChecked(); //将状态值添加进存放父级的集合 list.get(position).setCb1(checked1); //获取到Activity,方便对全选做操作 MainActivity con=(MainActivity)context; //遍历父级的集合 for (Goodsuser i:list){ //取出我们添加在集合的一个布尔值 boolean item1_cb = i.isCb1(); //如果我们的父级其中有一条没有被选中 if(!item1_cb){ //那么我们的总的全选按钮就不勾选 con.ck_all.setChecked(false); break;//必选加,否则会出现去掉父级的按钮全选按钮就不会被取消 }else{ con.ck_all.setChecked(true); } } con.changesum(list2); //获取到我们子级的集合长度 int size = list2.get(position).size(); //如果我们的父级全部被选中 if(checked1){ //那么你就遍历子级的长度 for (int j=0;j<size;j++){ //将我们的子级全部都选中 list2.get(position).get(j).setCb2(true); } }else{ for (int j=0;j<size;j++){ list2.get(position).get(j).setCb2(false); } } //刷新我们的适配器 notifyDataSetChanged(); con.changesum(list2); } }); 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.layout_suertow,null); holder.rv=view.findViewById(R.id.tittle); holder.item_img66=view.findViewById(R.id.img); holder.item_price=view.findViewById(R.id.price3); holder.item_cb=view.findViewById(R.id.cb2); 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()); holder.jiajia.setOnAddDelClickListener(new AddDleneteView.OnAddDelClickListener() { @Override public void onAddClick(View v) { int number = holder.jiajia.getNumber(); number++; holder.jiajia.setNumber(number); list2.get(i).get(i1).setNum(number); Log.e("-----jia",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); Log.e("-----建",number+""); notifyDataSetChanged(); con.changesum(list2); } }); view.setTag(holder); }else{ holder=(ChildViewHolder)view.getTag(); } holder.rv.setText(list2.get(i).get(i1).getTitle()); String images =list2.get(i).get(i1).getImg(); String[] split = images.split("\\|"); Glide.with(context).load(split[0]).into(holder.item_img66); holder.item_price.setText(list2.get(i).get(i1).getPrice()+""); holder.item_cb.setChecked(list2.get(i).get(i1).isCb2()); holder.item_cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //定义一个flag用于跳出循环 boolean flag=false; //获取我们子级的选中状态 boolean checked = holder.item_cb.isChecked(); //将选中状态返回给我们存放子级的集合中 list2.get(i).get(i1).setCb2(checked); //获取到Activity MainActivity con=(MainActivity)context; //循环我们的子级集合 for (List<Goodsuser2> i1:list2){ //循环第二层的集合 for (int j=0;j<i1.size();j++){ //获取到子级条目数的选中状态 boolean chokx = i1.get(j).isCb2(); //如果我们的子级条目有一条未被选中 if(!chokx){ //那么就让我们的全选按钮为未选中 con.ck_all.setChecked(false); //同时将父级的按钮也变为未选中 list.get(i).setCb1(false); //flag为true,跳出本层的循环 flag=true; break; }else{ con.ck_all.setChecked(true); list.get(i).setCb1(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).isCb2(); //如果子级有一条未被选中 if(!chokx){ //那么我们的父级按钮就不会被选中 list.get(i).setCb1(false); break; }else{ list.get(i).setCb1(true); } } notifyDataSetChanged(); con.changesum(list2); } }); return view; } @Override public boolean isChildSelectable(int i, int i1) { return false; } class GroupViewHolder { CheckBox cb; TextView tv; } class ChildViewHolder { TextView rv; ImageView item_img66; TextView item_price; TextView txt_delete; TextView et_number; TextView txt_add; CheckBox item_cb; AddDleneteView jiajia; } }
//Activty解绑
//解绑 @Override protected void onDestroy() { super.onDestroy(); if (dayPresenter != null) { dayPresenter.detachView(); } }