Andriod購物車實現二級列表(MVP)

                            


依賴:

compile 'com.squareup.okhttp3:okhttp:3.3.0'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.squareup.okio:okio:1.5.0'
compile 'com.github.bumptech.glide:glide:3.6.1'

權限:

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

HTTP包:

package com.example.administrator.xiaoshixun_gouwuche.Http;

import android.os.Handler;
import android.os.Message;

import java.io.IOException;
import java.util.Map;
import java.util.Set;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * ok工具類
 */

public class OkHttpUtils {
   private static OkHttpUtils okHttpUtils = null;
   private MyHandler myHandler = new MyHandler();
   private OkLoadListener okLoadListener;

   //單例
   public static OkHttpUtils getInstance() {
      if (okHttpUtils == null) {
         okHttpUtils = new OkHttpUtils();
      }
      return okHttpUtils;
   }

   //get
   public void okGet(String url) {
      OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new MyInter()).build();
      Request request = new Request.Builder().url(url).build();
      Call call = client.newCall(request);
      call.enqueue(new Callback() {
         @Override
         public void onFailure(Call call, IOException e) {
            Message message = myHandler.obtainMessage();
            message.what = 0;
            message.obj = e.getMessage();
            myHandler.sendMessage(message);
         }

         @Override
         public void onResponse(Call call, Response response) throws IOException {
            Message message = myHandler.obtainMessage();
            message.what = 1;
            message.obj = response.body().string();
            myHandler.sendMessage(message);
         }
      });
   }

   //post
   public void okPost(String url, Map<String, String> map) {
      OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new MyInter()).build();
      //創建FormBody
      FormBody.Builder builder = new FormBody.Builder();
      //遍歷map
      Set<String> keys = map.keySet();
      for (String key : keys) {
         String value = map.get(key);
         builder.add(key, value+"");
      }
      //build
      FormBody body = builder.build();
      Request request = new Request.Builder().url(url).post(body).build();
      Call call = client.newCall(request);
      call.enqueue(new Callback() {
         @Override
         public void onFailure(Call call, IOException e) {
            Message message = myHandler.obtainMessage();
            message.what = 0;
            message.obj = e.getMessage();
            myHandler.sendMessage(message);
         }

         @Override
         public void onResponse(Call call, Response response) throws IOException {
            Message message = myHandler.obtainMessage();
            message.what = 1;
            message.obj = response.body().string();
            myHandler.sendMessage(message);
         }
      });
   }

   //攔截器
   class MyInter implements Interceptor {
      private static final String TAG = "MyInter";
      @Override
      public Response intercept(Chain chain) throws IOException {
         //獲取原來的body
         Request request = chain.request();
         RequestBody body = request.body();
         if (body instanceof FormBody) {
            //遍歷原來的所有參數,加到新的Body裏面,最後將公共參數加到新的Body
            FormBody.Builder newBuilder = new FormBody.Builder();
            for (int i = 0; i < ((FormBody) body).size(); i++) {
               String name = ((FormBody) body).name(i);
               String value = ((FormBody) body).value(i);

               //放入新的
               newBuilder.add(name, value);
            }
            //在將公共參數添加進去
            newBuilder.add("source", "android");
            FormBody newBody = newBuilder.build();
            //創建新的請求
            Request newRequest = request.newBuilder().post(newBody).build();
            Response response = chain.proceed(newRequest);
            return response;
         }

         return null;
      }
   }

   //handler
   class MyHandler extends Handler {
      @Override
      public void handleMessage(Message msg) {
         switch (msg.what) {
            case 0:
               //失敗
               String e = (String) msg.obj;
               okLoadListener.okLoadError(e);
               break;
            case 1:
               //成功
               String json = (String) msg.obj;
               okLoadListener.okLoadSuccess(json);
               break;
         }
      }
   }

   //提高外部調用的接口
   public void setOkLoadListener(OkLoadListener okLoadListener) {
      this.okLoadListener = okLoadListener;
   }
}

-------------接口-------------

public class HttpConfig {
   public static String detail_url = "https://www.zhaoapi.cn/product/getProductDetail";
   public static String add_url = "https://www.zhaoapi.cn/product/addCart";
   public static String cartList_url = "https://www.zhaoapi.cn/product/getCarts";
}

------------網絡監聽----------

public interface OkLoadListener {
   void okLoadSuccess(String json);

   void okLoadError(String error);
}

IMODEL包:


-----------IModel----------

public interface IModel {
    //獲取詳情界面的數據
    void getDetailData(String url, Map<String,String> parms,DetailLoadLister detailLoadLister);
    //展示購物車界面
    void showDataToCart(String url,Map<String,String> parms,CartListLoadListener cartListLoadListener);
    //計算總價
    double calcaulate(CartBean cartBean);

}

-----------IModel實現類----------

import android.util.Log;

import com.example.administrator.xiaoshixun_gouwuche.Http.OkHttpUtils;
import com.example.administrator.xiaoshixun_gouwuche.Http.OkLoadListener;
import com.example.administrator.xiaoshixun_gouwuche.bean.CartBean;

import java.util.List;
import java.util.Map;

/**
 * Model實現類
 */

public class ModelImpl implements IModel {
    //加載詳情界面
    @Override
    public void getDetailData(String url, Map<String, String> parms, final DetailLoadLister detailLoadLister) {
        OkHttpUtils ok = new OkHttpUtils();
        //用OkHttp請求,之後調用接口
        ok.okPost(url,parms);
        ok.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {
                //獲取成功
                detailLoadLister.detailLoadSuccess(json);
            }

            @Override
            public void okLoadError(String error) {
                //獲取失敗
                detailLoadLister.detailLoadError(error);
            }
        });
    }

    //展示購物車的數據
    private static final String TAG = "ModelImpl";
    @Override
    public void showDataToCart(String url, Map<String, String> parms, final CartListLoadListener cartListLoadListener) {
        OkHttpUtils ok = new OkHttpUtils();
        ok.okPost(url,parms);
        ok.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {
                Log.d(TAG, "okLoadSuccess: "+json);
                cartListLoadListener.loadCartSuccess(json);
            }

            @Override
            public void okLoadError(String error) {
               cartListLoadListener.loadCartError(error);
            }
        });

    }

    //計算總價
    @Override
    public double calcaulate(CartBean cartBean) {
        double sum = 0;
        Log.d(TAG, "總價:"+cartBean+"====="+cartBean.getData());
        List<CartBean.DataBean> data = cartBean.getData();
        //遍歷主佈局
        for (int i = 0; i < data.size(); i++) {
            List<CartBean.ChildBean> list = data.get(i).getList();
            for (int j = 0; j < list.size(); j++) {
                //如果爲選擇狀態
                if (list.get(j).isChildIsSelected()) {
                    //獲取價格
                    double bargainPrice = list.get(j).getBargainPrice();
                    //賦值給sum
                    sum+=bargainPrice;
                }
            }
        }
        return sum;
    }
}
---------加載詳情頁監聽---------


public interface DetailLoadLister {
    void detailLoadSuccess(String json);
    void detailLoadError(String error);
}

-------加載購物車界面監聽

public interface CartListLoadListener {
   //購物車數據,加載成功
   void loadCartSuccess(String json);

   //加載失敗
   void loadCartError(String error);
}

Precenter:

public interface IPrecenter {
    //將數據展示到詳情界面
    void showDataToDetai(IModel iModel, IMainView iMainView);
    //展示購物車數據
    void showDataToCart(Context context,IModel iModel, ICartView iCartView);
    //計算的方法
    void jiSuan(IModel iModel, CartBean cartBean,ICartView iCartView);

}
--------------Precenter實現類----------


public class PrecenterImpl implements IPrecenter  {
    private static final String TAG = "PrecenterImpl";

    //展示數據到詳情界面的方法
    @Override
    public void showDataToDetai(IModel iModel, final IMainView iMainView) {
        Map<String,String> prams = new HashMap<String,String>();
        prams.put("pid","17");
        iModel.getDetailData(HttpConfig.detail_url, prams, new DetailLoadLister() {
            @Override
            public void detailLoadSuccess(String json) {

                Log.d(TAG, "detailLoadSuccess: "+json);
                //解析數據
                Gson gson = new Gson();
                DetailBean detailBean = gson.fromJson(json, DetailBean.class);
                iMainView.showDetailData(detailBean);
            }

            @Override
            public void detailLoadError(String error) {
                Log.d(TAG, "detailLoadError: "+"數據請求失敗");
            }
        });

    }
    //展示購物車數據
    @Override
    public void showDataToCart(final Context context, IModel iModel, final ICartView iCartView) {
        Map<String,String> map = new HashMap<String,String>();
        map.put("uid","71");
        iModel.showDataToCart(HttpConfig.cartList_url, map, new CartListLoadListener() {
            @Override
            public void loadCartSuccess(String json) {
                Log.d(TAG, "購物車數據: "+json);
                Gson gson = new Gson();
                CartBean cartBean = gson.fromJson(json, CartBean.class);
                iCartView.showDataToCart(context,cartBean);
            }

            @Override
            public void loadCartError(String error) {
                Log.d(TAG, "loadCartError: "+"失敗");
            }
        });

    }

    //計算總價
    @Override
    public void jiSuan(IModel iModel, CartBean cartBean, ICartView iCartView) {
       
        Log.d(TAG, "計算: "+iCartView.getCartBean());


        //調用model計算總價的方法
        double sum = iModel.calcaulate(cartBean);
        //數據給view
        iCartView.showSum(sum);
    }

Iview:

------------IMainView-----------


public interface IMainView {
    //展示詳情數據的方法
    void showDetailData(DetailBean detailBean);



}
-----------Maintiviy--------------


public class MainActivity extends AppCompatActivity implements IMainView,View.OnClickListener {

    private PrecenterImpl precenter;

    private ImageView main_big_pic;
    private TextView man_name;
    private TextView main_price;
    private TextView main_price2;
    private DetailBean detailBean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initViews();
        //回調
        precenter = new PrecenterImpl();
        precenter.showDataToDetai(new ModelImpl(),this);

    }

    private void initViews() {
        main_big_pic = findViewById(R.id.main_big_pic);
        man_name = findViewById(R.id.main_name);
        main_price = findViewById(R.id.main_price);
        main_price2 = findViewById(R.id.main_price2);
        TextView main_cart = findViewById(R.id.main_cart);
        TextView main_add = findViewById(R.id.main_add);
        main_cart.setOnClickListener(this);
        main_add.setOnClickListener(this);


    }

    //展示詳情數據
    @Override
    public void showDetailData(DetailBean detailBean) {
        this.detailBean = detailBean;
        String images = detailBean.getData().getImages();
        String imgurl = images.split(".jpg")[0] + ".jpg";

        //設置圖片
        Glide.with(MainActivity.this).load(imgurl).into(main_big_pic);
        man_name.setText(detailBean.getData().getTitle());
        //原價
        main_price.setText(detailBean.getData().getPrice()+"");
        //刪除線
        main_price.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
        //優惠價
        main_price2.setText("折扣價" + detailBean.getData().getBargainPrice() + "");

    }

    //按鈕事件
    @Override
    public void onClick(View view) {
            switch(view.getId()){
                    case R.id.main_cart:
                        //調用跳轉
                        startActivity(new Intent(MainActivity.this,CartActivity.class));

                    break;
                    case R.id.main_add:
                        //添加購物車

                    break;

                }

    }
}
------------Maintivity佈局----------

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.gjl.yuekaolianxi.view.MainActivity">

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

        <TextView
            android:id="@+id/back"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="@mipmap/ic_launcher"/>

        <TextView
            android:textSize="20sp"
            android:id="@+id/main_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="商品詳情"/>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#F00"/>

    <ImageView
        android:layout_marginTop="80dp"
        android:id="@+id/main_big_pic"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:textSize="30sp"
            android:id="@+id/main_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="商品名"/>

        <TextView
            android:textSize="30sp"
            android:textColor="#F00"
            android:id="@+id/main_price"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="原價"/>

        <TextView
            android:textSize="30sp"
            android:id="@+id/main_price2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="折扣價"/>

    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#F00"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:orientation="horizontal">

        <TextView
            android:textSize="30sp"
            android:id="@+id/main_cart"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:clickable="true"
            android:gravity="center"
            android:text="購物車"/>

        <View
            android:layout_width="0.75dp"
            android:layout_height="match_parent"
            android:background="#F00"/>

        <TextView
            android:textSize="30sp"
            android:id="@+id/main_add"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:clickable="true"
            android:gravity="center"
            android:text="加入購物車"/>
    </LinearLayout>

</LinearLayout>

---------------ICartView-----------

public interface ICartView {
    //顯示數據
    void showDataToCart(Context context, CartBean cartBean);

    //調用bean類
    CartBean getCartBean();

    //顯示總價
    void showSum(double sum);
}


--------------Carttivity--------------

public class CartActivity extends AppCompatActivity implements ICartView, View.OnClickListener {


    private ExpandableListView ex_list_view;
    private CheckBox cart_cb;
    private TextView cart_sum;
    private CartBean cartBean;
    private Myadpater md;


    private static final String TAG = "CartActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        //初始化控件
        initViews();

        //回調
        PrecenterImpl precenter = new PrecenterImpl();
        precenter.showDataToCart(this, new ModelImpl(), this);
    }

    private void initViews() {
        ex_list_view = findViewById(R.id.ex_list_view);
        cart_cb = findViewById(R.id.cart_cb);
        cart_sum = findViewById(R.id.cart_sum12);
        //全選、反選的點擊事件
        cart_cb.setOnClickListener(this);

    }

    //展示購物車界面
    @Override
    public void showDataToCart(Context context, CartBean cartBean) {
        //提升作用域用作傳值
        this.cartBean = cartBean;
        Log.d(TAG, "showDataToCart: "+cartBean.getData().get(0).toString());
        //添加適配
        md = new Myadpater(context, cartBean, cartBean.getData(), this);
        ex_list_view.setAdapter(md);
        //將expanablelistview全部展開
        int groupCount = md.getGroupCount();
        for (int i = 0; i < groupCount; i++) {
            ex_list_view.expandGroup(i);
        }

    }

    //獲取CarBean
    @Override
    public CartBean getCartBean() {
        return cartBean;
    }

    //顯示總價
    @Override
    public void showSum(double sum) {
        Log.d(TAG, "showSum() returned: " + sum + "--" + cart_sum);
        TextView tv = findViewById(R.id.cart_sum12);
        tv.setText("總價:" + sum);

    }

    //點擊事件/全選/反選
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.cart_cb:
                //全部置爲反
                List<CartBean.DataBean> data = cartBean.getData();
                for (int i = 0; i < data.size(); i++) {
                    data.get(i).setParentIsSelected(!data.get(i).isParentIsSelected());
                    //子元素
                    List<CartBean.ChildBean> list = data.get(i).getList();
                    for (int j = 0; j < list.size(); j++) {
                        list.get(j).setChildIsSelected(!list.get(j).isChildIsSelected());
                    }
                }
                //通知刷新
                md.notifyDataSetChanged();

                //回調
                PrecenterImpl precenter = new PrecenterImpl();
                precenter.jiSuan(new ModelImpl(),cartBean,this);


                break;
        }
    }

}

-----------------Cartvitity佈局--------------



<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.gjl.yuekaolianxi.view.CartActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="購物車"
        android:textColor="@android:color/black"
        android:textSize="25sp"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#999999"/>

    <ExpandableListView
        android:id="@+id/ex_list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:groupIndicator="@null"></ExpandableListView>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#999999"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <CheckBox
            android:id="@+id/cart_cb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="全選/反選"
            android:textColor="@android:color/black"
            android:textSize="25sp"/>

        <TextView
            android:id="@+id/cart_sum12"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="總價:0"
            android:textColor="@android:color/black"
            android:textSize="25sp"/>
    </LinearLayout>

</LinearLayout>



----------動畫acitivity-----------

public class AnimatorActivity extends AppCompatActivity {

    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animator);
        //初始化控件
        initViews();
    }

    private void initViews() {
        imageView = (ImageView) findViewById(R.id.img);
        //調用動畫工具類
        AnimatorSet set = AnimatorUtils.setAnimatorSet(AnimatorActivity.this, imageView);
        //動畫的事件
        set.addListener(new AnimatorListenerAdapter() {
            @Override
            //動畫結束後的方法
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                startActivity(new Intent(AnimatorActivity.this,MainActivity.class));

                //加跳轉動畫
                overridePendingTransition(R.anim.enter,R.anim.out);
                //結束關掉本頁
                finish();
            }
        });
    }
}

-----------------動畫布局--------------


<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context="com.example.administrator.xiaoshixun_gouwuche.View.AnimatorActivity">

    <ImageView
        android:src="@mipmap/ic_launcher"
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

--------------動畫工具類--------------


/**
 * 動畫工具類
 */

public class AnimatorUtils {
    public static AnimatorSet setAnimatorSet(Context context, View view) {
        //獲取屏幕的一半
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        //獲取高度
        int heightPixels = metrics.heightPixels;
        //設置動畫
        ObjectAnimator translationY = ObjectAnimator.ofFloat(view, "translationY", 0, heightPixels / 2 - view.getHeight());
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 2.0f, 1.0f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 2.0f, 1.0f);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", 0, 1.0f);//透明
        ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation", 0, 360);//旋轉
        //創建動畫集合
        AnimatorSet set = new AnimatorSet();
        set.playTogether(translationY,scaleX,scaleY,alpha,rotation);
        set.setDuration(3000);
        set.start();//開啓動畫


        return set;
    }
}


----------跳轉動畫界面anim文件-------------

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="100%"
    android:toXDelta="0%">

</translate>


<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0%"
    android:toXDelta="-100%">

</translate>


---------------適配器---------------


public class Myadpater extends BaseExpandableListAdapter {

    private final Context context;
    private final CartBean cartBean;
    private final List<CartBean.DataBean> list;
    private final ICartView iCartView;

    //有參構造
    public Myadpater(Context context, CartBean cartBean, List<CartBean.DataBean> list, ICartView iCartView) {
        this.context = context;
        this.cartBean = cartBean;
        this.list = list;
        this.iCartView = iCartView;
    }

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

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

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

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

    @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) {
        ParetViewHolder paretViewHolder = null;
        if (view == null) {
            //獲取佈局
            view = LayoutInflater.from(context).inflate(R.layout.layout_parent, null);
            //獲取控件
            CheckBox parent_cb = view.findViewById(R.id.parent_cb);
            TextView parent_tv = view.findViewById(R.id.parent_tv);
            //放到優化當中
            paretViewHolder = new ParetViewHolder(parent_cb,parent_tv);
            view.setTag(paretViewHolder);

        }else{
            paretViewHolder = (ParetViewHolder) view.getTag();
        }

        //賦值
        paretViewHolder.getParent_cb().setChecked(list.get(i).isParentIsSelected());
        paretViewHolder.getParent_tv().setText(list.get(i).getSellerName());

        //點擊事件
        paretViewHolder.getParent_cb().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                boolean isSelected = list.get(i).isParentIsSelected();
                isSelected =!isSelected;
                list.get(i).setParentIsSelected(isSelected);

                //遍歷子元素,全部設置成true
                List<CartBean.ChildBean> list = Myadpater.this.list.get(i).getList();
                for (int j = 0; j<list.size();j++){
                    list.get(j).setChildIsSelected(isSelected);
                }

                //通知界面
                notifyDataSetChanged();

                //回調計算的方法
                PrecenterImpl presenter = new PrecenterImpl();
                presenter.jiSuan(new ModelImpl(),cartBean,iCartView);

            }
        });


        return view;
    }

    @Override
    public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {

        ChildeViewHolder childeViewHolder = null;
        if (view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.layout_child, null);
            CheckBox child_cb = view.findViewById(R.id.child_cb);
            ImageView child_img = view.findViewById(R.id.child_img);
            TextView child_title = view.findViewById(R.id.child_title);
            TextView child_price = view.findViewById(R.id.child_price);
            childeViewHolder = new ChildeViewHolder(child_cb, child_img, child_title, child_price);
            view.setTag(childeViewHolder);
        } else {
            childeViewHolder = (ChildeViewHolder) view.getTag();
        }
        //賦值
        childeViewHolder.getChild_cb().setChecked(list.get(i).getList().get(i1).isChildIsSelected());
        //獲取圖的地址

        String images = list.get(i).getList().get(i1).getImages();
        String imageUrl = images.split(".jpg")[0] + ".jpg";
        Glide.with(context).load(imageUrl).into(childeViewHolder.getChild_imge());
        childeViewHolder.getChild_title().setText(list.get(i).getList().get(i1).getTitle());
        childeViewHolder.getChild_price().setText(list.get(i).getList().get(i1).getBargainPrice() + "");
        //字條目中的checkbox點擊狀態
        //點擊事件
        childeViewHolder.getChild_cb().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean isCheked = list.get(i).getList().get(i1).isChildIsSelected();
                isCheked = !isCheked;
                list.get(i).getList().get(i1).setChildIsSelected(isCheked);
                //遍歷
                List<CartBean.ChildBean> list1 = Myadpater.this.list.get(i).getList();
                boolean flag = true;
                for (int i = 0; i < list1.size(); i++) {
                    if (!list1.get(i).isChildIsSelected()) {
                        flag = false;
                    }
                }
                list.get(i).setParentIsSelected(flag);
                //通知改變
                notifyDataSetChanged();
                //計算
                //計算
                PrecenterImpl presenter = new PrecenterImpl();
                presenter.jiSuan(new ModelImpl(), cartBean, iCartView);

            }
        });


        return view;
    }

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


    //優化一級列表
    class ParetViewHolder{
        public CheckBox parent_cb;
        public TextView parent_tv;

        public ParetViewHolder(CheckBox parent_cb, TextView parent_tv) {
            this.parent_cb = parent_cb;
            this.parent_tv = parent_tv;
        }

        //setget方法

        public CheckBox getParent_cb() {
            return parent_cb;
        }

        public TextView getParent_tv() {
            return parent_tv;
        }

        public void setParent_cb(CheckBox parent_cb) {
            this.parent_cb = parent_cb;
        }

        public void setParent_tv(TextView parent_tv) {
            this.parent_tv = parent_tv;
        }
    }

    //優化二級列表
    class ChildeViewHolder {
        public CheckBox child_cb;
        public ImageView child_imge;
        public TextView child_title;
        public TextView child_price;

        public ChildeViewHolder(CheckBox child_cb, ImageView child_imge, TextView child_title, TextView child_price) {
            this.child_cb = child_cb;
            this.child_imge = child_imge;
            this.child_title = child_title;
            this.child_price = child_price;
        }

        public CheckBox getChild_cb() {
            return child_cb;
        }

        public void setChild_cb(CheckBox child_cb) {
            this.child_cb = child_cb;
        }

        public ImageView getChild_imge() {
            return child_imge;
        }

        public void setChild_imge(ImageView child_imge) {
            this.child_imge = child_imge;
        }

        public TextView getChild_title() {
            return child_title;
        }

        public void setChild_title(TextView child_title) {
            this.child_title = child_title;
        }

        public TextView getChild_price() {
            return child_price;
        }

        public void setChild_price(TextView child_price) {
            this.child_price = child_price;
        }
    }
}


Bean類:

----------詳情bean-------

public class CartBean {
   private String msg;
   private String code;
   private List<DataBean> data;

   public String getMsg() {
      return msg;
   }

   public void setMsg(String msg) {
      this.msg = msg;
   }

   public String getCode() {
      return code;
   }

   public void setCode(String code) {
      this.code = code;
   }

   public List<DataBean> getData() {
      return data;
   }

   public void setData(List<DataBean> data) {
      this.data = data;
   }

   public static class DataBean {
      //添加一boolean,記錄選中狀態
      private boolean parentIsSelected;

      public DataBean(boolean parentIsSelected, String sellerName, String sellerid, List<ChildBean> list) {
         this.parentIsSelected = parentIsSelected;
         this.sellerName = sellerName;
         this.sellerid = sellerid;
         this.list = list;
      }

      public boolean isParentIsSelected() {
         return parentIsSelected;
      }

      public void setParentIsSelected(boolean parentIsSelected) {
         this.parentIsSelected = parentIsSelected;
      }

      private String sellerName;
      private String sellerid;
      private List<ChildBean> list;

      public String getSellerName() {
         return sellerName;
      }

      public void setSellerName(String sellerName) {
         this.sellerName = sellerName;
      }

      public String getSellerid() {
         return sellerid;
      }

      public void setSellerid(String sellerid) {
         this.sellerid = sellerid;
      }

      public List<ChildBean> getList() {
         return list;
      }

      public void setList(List<ChildBean> list) {
         this.list = list;
      }
   }

   public class ChildBean {

      private double bargainPrice;
      private String createtime;
      private String detailUrl;
      private String images;
      private double num;
      private double pid;
      private double price;
      private double pscid;
      private double selected;
      private double sellerid;
      private String subhead;
      private String title;
      private boolean childIsSelected;

      public ChildBean(double bargainPrice, String createtime, String detailUrl, String images, double num, double pid, double price, double pscid, double selected, double sellerid, String subhead, String title, boolean childIsSelected) {
         this.bargainPrice = bargainPrice;
         this.createtime = createtime;
         this.detailUrl = detailUrl;
         this.images = images;
         this.num = num;
         this.pid = pid;
         this.price = price;
         this.pscid = pscid;
         this.selected = selected;
         this.sellerid = sellerid;
         this.subhead = subhead;
         this.title = title;
         this.childIsSelected = childIsSelected;
      }

      public boolean isChildIsSelected() {
         return childIsSelected;
      }

      public void setChildIsSelected(boolean childIsSelected) {
         this.childIsSelected = childIsSelected;
      }

      public double getBargainPrice() {
         return bargainPrice;
      }

      public void setBargainPrice(double bargainPrice) {
         this.bargainPrice = bargainPrice;
      }

      public String getCreatetime() {
         return createtime;
      }

      public void setCreatetime(String createtime) {
         this.createtime = createtime;
      }

      public String getDetailUrl() {
         return detailUrl;
      }

      public void setDetailUrl(String detailUrl) {
         this.detailUrl = detailUrl;
      }

      public String getImages() {
         return images;
      }

      public void setImages(String images) {
         this.images = images;
      }

      public double getNum() {
         return num;
      }

      public void setNum(double num) {
         this.num = num;
      }

      public double getPid() {
         return pid;
      }

      public void setPid(double pid) {
         this.pid = pid;
      }

      public double getPrice() {
         return price;
      }

      public void setPrice(double price) {
         this.price = price;
      }

      public double getPscid() {
         return pscid;
      }

      public void setPscid(double pscid) {
         this.pscid = pscid;
      }

      public double getSelected() {
         return selected;
      }

      public void setSelected(double selected) {
         this.selected = selected;
      }

      public double getSellerid() {
         return sellerid;
      }

      public void setSellerid(double sellerid) {
         this.sellerid = sellerid;
      }

      public String getSubhead() {
         return subhead;
      }

      public void setSubhead(String subhead) {
         this.subhead = subhead;
      }

      public String getTitle() {
         return title;
      }

      public void setTitle(String title) {
         this.title = title;
      }
   }
}

-----------Cartbean---------
public class DetailBean {

    /**
     * msg :
     * seller : {"description":"我是商家17","icon":"http://120.27.23.105/images/icon.png","name":"商家17","productNums":999,"score":5,"sellerid":17}
     * code : 0
     * data : {"bargainPrice":111.99,"createtime":"2017-10-14T21:39:05","detailUrl":"https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg","itemtype":1,"pid":1,"price":118,"pscid":1,"salenum":0,"sellerid":17,"subhead":"每個中秋都不能簡單,無論身在何處,你總需要一塊餅讓生活更圓滿,京東月餅讓愛更圓滿京東自營,閃電配送,更多驚喜,快用手指戳一下","title":"北京稻香村 稻香村中秋節月餅 老北京月餅禮盒655g"}
     */

    private String msg;
    private SellerBean seller;
    private String code;
    private DataBean data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public SellerBean getSeller() {
        return seller;
    }

    public void setSeller(SellerBean seller) {
        this.seller = seller;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class SellerBean {
        /**
         * description : 我是商家17
         * icon : http://120.27.23.105/images/icon.png
         * name : 商家17
         * productNums : 999
         * score : 5
         * sellerid : 17
         */

        private String description;
        private String icon;
        private String name;
        private int productNums;
        private int score;
        private int sellerid;

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getIcon() {
            return icon;
        }

        public void setIcon(String icon) {
            this.icon = icon;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getProductNums() {
            return productNums;
        }

        public void setProductNums(int productNums) {
            this.productNums = productNums;
        }

        public int getScore() {
            return score;
        }

        public void setScore(int score) {
            this.score = score;
        }

        public int getSellerid() {
            return sellerid;
        }

        public void setSellerid(int sellerid) {
            this.sellerid = sellerid;
        }
    }

    public static class DataBean {
        /**
         * bargainPrice : 111.99
         * createtime : 2017-10-14T21:39:05
         * detailUrl : https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends
         * images : https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg
         * itemtype : 1
         * pid : 1
         * price : 118
         * pscid : 1
         * salenum : 0
         * sellerid : 17
         * subhead : 每個中秋都不能簡單,無論身在何處,你總需要一塊餅讓生活更圓滿,京東月餅讓愛更圓滿京東自營,閃電配送,更多驚喜,快用手指戳一下
         * title : 北京稻香村 稻香村中秋節月餅 老北京月餅禮盒655g
         */

        private double bargainPrice;
        private String createtime;
        private String detailUrl;
        private String images;
        private int itemtype;
        private int pid;
        private int price;
        private int pscid;
        private int salenum;
        private int sellerid;
        private String subhead;
        private String title;

        public double getBargainPrice() {
            return bargainPrice;
        }

        public void setBargainPrice(double bargainPrice) {
            this.bargainPrice = bargainPrice;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        public String getDetailUrl() {
            return detailUrl;
        }

        public void setDetailUrl(String detailUrl) {
            this.detailUrl = detailUrl;
        }

        public String getImages() {
            return images;
        }

        public void setImages(String images) {
            this.images = images;
        }

        public int getItemtype() {
            return itemtype;
        }

        public void setItemtype(int itemtype) {
            this.itemtype = itemtype;
        }

        public int getPid() {
            return pid;
        }

        public void setPid(int pid) {
            this.pid = pid;
        }

        public int getPrice() {
            return price;
        }

        public void setPrice(int price) {
            this.price = price;
        }

        public int getPscid() {
            return pscid;
        }

        public void setPscid(int pscid) {
            this.pscid = pscid;
        }

        public int getSalenum() {
            return salenum;
        }

        public void setSalenum(int salenum) {
            this.salenum = salenum;
        }

        public int getSellerid() {
            return sellerid;
        }

        public void setSellerid(int sellerid) {
            this.sellerid = sellerid;
        }

        public String getSubhead() {
            return subhead;
        }

        public void setSubhead(String subhead) {
            this.subhead = subhead;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章