购物车展示+全选反选

添加网络权限

添加依赖

compile 'com.squareup.okhttp3:okhttp:3.6.0'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.android.support:recyclerview-v7:24.0.0'
    compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0'
    compile 'jp.wasabeef:glide-transformations:2.0.1'



一.xml布局

1.main_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.tangxueqin.gouwuche_demo.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/third_list"
        android:layout_width="match_parent"
        android:layout_height="700dp"
        ></android.support.v7.widget.RecyclerView>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:background="#f00"
        />

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

        >

        <CheckBox
            android:id="@+id/all_check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="全选/反选" />

        <TextView
            android:id="@+id/total_price"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:textColor="#f00" />

        <Button
            android:id="@+id/goto_charge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#f00"
            android:padding="10dp"
            android:text="去结算"
            android:textColor="#fff" />
    </LinearLayout>
</LinearLayout>

2.

<?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="wrap_content"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

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

        <TextView
            android:id="@+id/card_sellername"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/card_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>

</LinearLayout>

3.

<?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="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">
    <CheckBox
        android:id="@+id/card_goodscheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/card_goodsimg"
        android:layout_width="80dp"
        android:layout_height="80dp" />

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

        <TextView
            android:id="@+id/card_goodsname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

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

            <TextView
                android:id="@+id/card_goodsprice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#f00" />

            <!--<com.example.monthpractice1.view.PlusReduceView-->
                <!--android:id="@+id/card_goodsnum"-->
                <!--android:layout_width="wrap_content"-->
                <!--android:layout_height="wrap_content"-->
                <!--android:textColor="#f00" />-->
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

4.自定义的加减器

<?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="#eee"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/view_reduce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ddd"
        android:padding="10dp"
        android:text="—" />

    <EditText
        android:id="@+id/view_sum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#fff"
        android:padding="10dp"
        android:inputType="number"
        android:text="0" />
    <TextView
        android:id="@+id/view_plus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ddd"
        android:padding="10dp"
        android:text="+" />
</LinearLayout>
二.代码

1.util

(okhttputil

package com.example.tangxueqin.gouwuche_demo.util;

import android.os.Environment;

import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;

/**
 * Created by tangxueqin on 2018/3/3.
 */
public class OkhttpUtil {
    //单例模式开始
    private static OkhttpUtil util;

    private OkhttpUtil() {
    }

    public static OkhttpUtil getInstance() {
        if (util == null) {
            synchronized (OkhttpUtil.class) {
                if (util == null) {
                    util = new OkhttpUtil();
                }
            }
        }
        return util;
    }

    //单例模式结束
    private static OkHttpClient okHttpClient;

    //实例化OKHTTPclient的对象
    private static OkHttpClient getOkHttpClient() {
        MyGetInterceptor interceptor = new MyGetInterceptor.Builder().addQueryParam("source", "android").build();
        if (okHttpClient == null) {
            File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");
            int cacheSize = 10 * 1024 * 1024;
            okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(interceptor)
                    .connectTimeout(15, TimeUnit.SECONDS)
                    .cache(new Cache(sdcache, cacheSize))
                    .build();
        }
        return okHttpClient;
    }


    /**
     * get请求
     * 参数1 url
     * 参数2 回调Callback
     * 使用单例,方法不需要用static修饰;
     */

    public  void doGet(String url, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        // OkHttpClient okHttpClient=new OkHttpClient();
        //创建Request
        Request request = new Request.Builder().url(url).build();
        //得到Call对象
        Call call = okHttpClient.newCall(request);
        //执行异步请求
        call.enqueue(callback);


    }

    /**
     * post请求
     * 参数1 url
     * 参数2 回调Callback
     */

    public void doPost(String url, Map<String, String> params, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        //3.x版本post请求换成FormBody 封装键值对参数
        FormBody.Builder builder = new FormBody.Builder();
        //遍历集合
        for (String key : params.keySet()) {
            builder.add(key, params.get(key));
        }
        //创建Request
        Request request = new Request.Builder().url(url).post(builder.build()).build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);

    }
}
拦截器

package com.example.tangxueqin.gouwuche_demo.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by tangxueqin on 2018/3/3.
 * 拦截器
 */
public class MyGetInterceptor implements Interceptor {

    Map<String, String> queryParamsMap = new HashMap<>(); // 添加到 URL 末尾,Get Post 方法都使用

    // 私有构造器
    private MyGetInterceptor() {
    }

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();

        // process queryParams inject whatever it's GET or POST
        if (queryParamsMap.size() > 0) {
            request = injectParamsIntoUrl(request.url().newBuilder(), requestBuilder, queryParamsMap);
        }
        return chain.proceed(request);
    }


    // func to inject params into url
    private Request injectParamsIntoUrl(HttpUrl.Builder httpUrlBuilder, Request.Builder requestBuilder, Map<String, String> paramsMap) {
        if (paramsMap.size() > 0) {
            Iterator iterator = paramsMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
                httpUrlBuilder.addQueryParameter((String) entry.getKey(), (String) entry.getValue());
            }
            requestBuilder.url(httpUrlBuilder.build());
            return requestBuilder.build();
        }
        return null;
    }



    public static class Builder {

        MyGetInterceptor interceptor;

        public Builder() {
            interceptor = new MyGetInterceptor();
        }

        // 添加公共参数到 URL
        public MyGetInterceptor.Builder addQueryParam(String key, String value) {
            interceptor.queryParamsMap.put(key, value);
            return this;
        }

        // 添加公共参数到 URL
        public MyGetInterceptor.Builder addQueryParamsMap(Map<String, String> queryParamsMap) {
            interceptor.queryParamsMap.putAll(queryParamsMap);
            return this;
        }

        public MyGetInterceptor build() {
            return interceptor;
        }

    }
}

Gson解析util

package com.example.tangxueqin.gouwuche_demo.util;

import android.os.Handler;

import com.google.gson.Gson;

import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * Created by tangxueqin on 2018/3/3.
 */
public abstract class GsonObjectCallback<T> implements Callback{
    private Handler handler = new Handler();

    //主线程处理
    public abstract void onUi(T t);

    //主线程处理
    public abstract void onFailed(Call call, IOException e);


    //请求失败
    @Override
    public void onFailure(final Call call, final IOException e) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                onFailed(call, e);
            }
        });
    }

    //请求json 并直接返回泛型的对象 主线程处理
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String json = response.body().string();
        Class<T> cls = null;

        Class clz = this.getClass();
        ParameterizedType type = (ParameterizedType) clz.getGenericSuperclass();
        Type[] types = type.getActualTypeArguments();
        cls = (Class<T>) types[0];
        Gson gson = new Gson();
        final T t = gson.fromJson(json, cls);
        handler.post(new Runnable() {
            @Override
            public void run() {
                onUi(t);
            }
        });
    }
}

公共参数

package com.example.tangxueqin.gouwuche_demo.util;

import android.text.TextUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.Buffer;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public class BasicParamsInterceptor implements Interceptor {
    Map<String, String> queryParamsMap = new HashMap<>(); // 添加到 URL 末尾,Get Post 方法都使用
    Map<String, String> paramsMap = new HashMap<>(); // 添加到公共参数到消息体,适用 Post 请求
    Map<String, String> headerParamsMap = new HashMap<>(); // 公共 Headers 添加
    List<String> headerLinesList = new ArrayList<>(); // 消息头 集合形式,一次添加一行

    // 私有构造器
    private BasicParamsInterceptor() {
    }

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();

        // process header params inject
        Headers.Builder headerBuilder = request.headers().newBuilder();
        // 以 Entry 添加消息头
        if (headerParamsMap.size() > 0) {
            Iterator iterator = headerParamsMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
                headerBuilder.add((String) entry.getKey(), (String) entry.getValue());
            }
        }
        // 以 String 形式添加消息头
        if (headerLinesList.size() > 0) {
            for (String line : headerLinesList) {
                headerBuilder.add(line);
            }
            requestBuilder.headers(headerBuilder.build());
        }
        // process header params end


        // process queryParams inject whatever it's GET or POST
        if (queryParamsMap.size() > 0) {
            request = injectParamsIntoUrl(request.url().newBuilder(), requestBuilder, queryParamsMap);
        }

        // process post body inject
        if (paramsMap.size() > 0) {
            if (canInjectIntoBody(request)) {
                FormBody.Builder formBodyBuilder = new FormBody.Builder();
                for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
                    formBodyBuilder.add((String) entry.getKey(), (String) entry.getValue());
                }

                RequestBody formBody = formBodyBuilder.build();
                String postBodyString = bodyToString(request.body());
                postBodyString += ((postBodyString.length() > 0) ? "&" : "") + bodyToString(formBody);
                requestBuilder.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"), postBodyString));
            }
        }
        request = requestBuilder.build();
        return chain.proceed(request);
    }

    /**
     * 确认是否是 post 请求
     *
     * @param request 发出的请求
     * @return true 需要注入公共参数
     */
    private boolean canInjectIntoBody(Request request) {
        if (request == null) {
            return false;
        }
        if (!TextUtils.equals(request.method(), "POST")) {
            return false;
        }
        RequestBody body = request.body();
        if (body == null) {
            return false;
        }
        MediaType mediaType = body.contentType();
        if (mediaType == null) {
            return false;
        }
        if (!TextUtils.equals(mediaType.subtype(), "x-www-form-urlencoded")) {
            return false;
        }
        return true;
    }

    // func to inject params into url
    private Request injectParamsIntoUrl(HttpUrl.Builder httpUrlBuilder, Request.Builder requestBuilder, Map<String, String> paramsMap) {
        if (paramsMap.size() > 0) {
            Iterator iterator = paramsMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
                httpUrlBuilder.addQueryParameter((String) entry.getKey(), (String) entry.getValue());
            }
            requestBuilder.url(httpUrlBuilder.build());
            return requestBuilder.build();
        }
        return null;
    }

    private static String bodyToString(final RequestBody request) {
        try {
            final RequestBody copy = request;
            Buffer buffer = new Buffer();
            if (copy != null)
                copy.writeTo(buffer);
            else
                return "";
            return buffer.readUtf8();
        } catch (final IOException e) {
            return "did not work";
        }
    }

    public static class Builder {

        BasicParamsInterceptor interceptor;

        public Builder() {
            interceptor = new BasicParamsInterceptor();
        }

        // 添加公共参数到 post 消息体
        public Builder addParam(String key, String value) {
            interceptor.paramsMap.put(key, value);
            return this;
        }

        // 添加公共参数到 post 消息体
        public Builder addParamsMap(Map<String, String> paramsMap) {
            interceptor.paramsMap.putAll(paramsMap);
            return this;
        }

        // 添加公共参数到消息头
        public Builder addHeaderParam(String key, String value) {
            interceptor.headerParamsMap.put(key, value);
            return this;
        }

        // 添加公共参数到消息头
        public Builder addHeaderParamsMap(Map<String, String> headerParamsMap) {
            interceptor.headerParamsMap.putAll(headerParamsMap);
            return this;
        }

        // 添加公共参数到消息头
        public Builder addHeaderLine(String headerLine) {
            int index = headerLine.indexOf(":");
            if (index == -1) {
                throw new IllegalArgumentException("Unexpected header: " + headerLine);
            }
            interceptor.headerLinesList.add(headerLine);
            return this;
        }

        // 添加公共参数到消息头
        public Builder addHeaderLinesList(List<String> headerLinesList) {
            for (String headerLine: headerLinesList) {
                int index = headerLine.indexOf(":");
                if (index == -1) {
                    throw new IllegalArgumentException("Unexpected header: " + headerLine);
                }
                interceptor.headerLinesList.add(headerLine);
            }
            return this;
        }

        // 添加公共参数到 URL
        public Builder addQueryParam(String key, String value) {
            interceptor.queryParamsMap.put(key, value);
            return this;
        }

        // 添加公共参数到 URL
        public Builder addQueryParamsMap(Map<String, String> queryParamsMap) {
            interceptor.queryParamsMap.putAll(queryParamsMap);
            return this;
        }

        public BasicParamsInterceptor build() {
            return interceptor;
        }

    }
}


2.bean

package com.example.tangxueqin.gouwuche_demo.bean;

import java.util.List;

/**
 * Created by tangxueqin on 2018/3/3.
 */
public class CardBean {
    /**
     * msg : 请求成功
     * code : 0
     * data : [{"list":[{"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","num":8,"pid":1,"price":118,"pscid":1,"selected":0,"sellerid":17,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}],"sellerName":"商家17","sellerid":"17"},{"list":[{"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","num":4,"pid":2,"price":299,"pscid":1,"selected":0,"sellerid":18,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}],"sellerName":"商家18","sellerid":"18"}]
     */

    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 {
        /**
         * list : [{"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","num":8,"pid":1,"price":118,"pscid":1,"selected":0,"sellerid":17,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}]
         * sellerName : 商家17
         * sellerid : 17
         */

        private String sellerName;
        private String sellerid;
        private List<ListBean> 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<ListBean> getList() {
            return list;
        }

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

        public static class ListBean {
            /**
             * 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
             * num : 8
             * pid : 1
             * price : 118.0
             * pscid : 1
             * selected : 0
             * sellerid : 17
             * subhead : 每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下
             * title : 北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g
             */

            private double bargainPrice;
            private String createtime;
            private String detailUrl;
            private String images;
            private int num;
            private int pid;
            private double price;
            private int pscid;
            private int selected;
            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 getNum() {
                return num;
            }

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

            public int getPid() {
                return pid;
            }

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

            public double getPrice() {
                return price;
            }

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

            public int getPscid() {
                return pscid;
            }

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

            public int getSelected() {
                return selected;
            }

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

            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;
            }
        }
    }
}

3.view

package com.example.tangxueqin.gouwuche_demo.view;

import com.example.tangxueqin.gouwuche_demo.bean.CardBean;

import java.util.List;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public interface ICardView {
    void showCardList(List<CardBean.DataBean> dataBeans);
}

自定义加减器view

package com.example.tangxueqin.gouwuche_demo.view;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.tangxueqin.gouwuche_demo.R;
import com.example.tangxueqin.gouwuche_demo.adapter.CardItemAdapter;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public class PlusReduceView extends LinearLayout implements View.OnClickListener, TextWatcher {
    private TextView plus, reduce;
    private EditText sumEdit;
    private int totalsum = 1;

    public PlusReduceView(Context context) {
        super(context);
        init(context);
    }

    public PlusReduceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public PlusReduceView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        LayoutInflater.from(context).inflate(R.layout.plus_add_view, this, true);
        plus = (TextView) findViewById(R.id.view_plus);
        reduce = (TextView) findViewById(R.id.view_reduce);
        sumEdit = (EditText) findViewById(R.id.view_sum);
        plus.setOnClickListener(this);
        reduce.setOnClickListener(this);
        sumEdit.addTextChangedListener(this);
    }

    private CardItemAdapter.OnChangeListner listner;

    public void setLinster(CardItemAdapter.OnChangeListner linster) {
        this.listner = linster;
    }

    //初始化数据;
    public void initData(int num) {
        totalsum = num;
        sumEdit.setText(totalsum + "");
        System.out.println(num);
        this.listner.getSum(totalsum);
    }

    public int getSumData() {
        return totalsum;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.view_plus:
                //获取输入框里的数字
                getSum();
                //+1
                initData(totalsum += 1);
                break;
            case R.id.view_reduce:
                //点击减号,获取输入框里的值,-1
                getSum();
                //先判断是否小于最小值1;如果>1才执行减法,否则不变;
                if (totalsum <= 1) {

                } else {
                    initData(totalsum -= 1);
                }
                break;

            default:
                break;
        }
    }

    private void getSum() {
        String text = sumEdit.getText().toString().trim();
        totalsum = Integer.parseInt(text);


    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable.toString().equals("")) {
            initData(1);
            sumEdit.setSelection(1);
        } else {
            if (!editable.toString().equals(totalsum + "")) {
                getSum();
                initData(totalsum);
                sumEdit.setSelection((totalsum + "").length());
            }
        }
    }
}

4.model

package com.example.tangxueqin.gouwuche_demo.model;

import com.example.tangxueqin.gouwuche_demo.bean.CardBean;
import com.example.tangxueqin.gouwuche_demo.util.GsonObjectCallback;
import com.example.tangxueqin.gouwuche_demo.util.OkhttpUtil;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public class CardModel {
    public void getCardList(String url, GsonObjectCallback<CardBean> callback) {
        OkhttpUtil.getInstance().doGet(url, callback);
    }
}

5.persenter

package com.example.tangxueqin.gouwuche_demo.persenter;

import com.example.tangxueqin.gouwuche_demo.bean.CardBean;
import com.example.tangxueqin.gouwuche_demo.model.CardModel;
import com.example.tangxueqin.gouwuche_demo.util.GsonObjectCallback;
import com.example.tangxueqin.gouwuche_demo.view.ICardView;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.List;

import okhttp3.Call;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public class CardPresenter {
    private CardModel model;
    private WeakReference<ICardView> reference;

    public CardPresenter() {
        this.model = new CardModel();
    }

    public void attachView(ICardView view) {
        reference = new WeakReference<ICardView>(view);
    }

    public void detachView() {
        if (reference != null) {
            reference.clear();
            reference = null;
        }
    }

    public void showCardList() {
        model.getCardList("https://www.zhaoapi.cn/product/getCarts?uid=4582", new GsonObjectCallback<CardBean>() {

                    @Override
                    public void onUi(CardBean cardBean) {
                        List<CardBean.DataBean> list=cardBean.getData();
                        if(list!=null){
                    for(int i=0;i<list.size();i++){
                        CardBean.DataBean bean=list.get(i);
                        if(bean.getList()==null||bean.getList().size()<=0){
                            list.remove(i);
                            i--;
                        }
                    }
                    reference.get().showCardList(list);
                }
                    }

                    @Override
                    public void onFailed(Call call, IOException e) {

                    }
                }

        );
    }
}


6.Adapter

(1

package com.example.tangxueqin.gouwuche_demo.adapter;

import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import com.example.tangxueqin.gouwuche_demo.R;
import com.example.tangxueqin.gouwuche_demo.bean.CardBean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> {
    private List<CardBean.DataBean> dataBeans = new ArrayList<>();
    private Context context;
    //存储勾选标志
    private List<Integer> tags = new ArrayList<>();
    private Map<Integer,Double> map=new HashMap<>();

    public CardAdapter(List<CardBean.DataBean> dataBeans, Context context) {
        this.dataBeans = dataBeans;
        this.context = context;
    }
    private CardItemAdapter.OnCheckListner listner;

    public void setSellerCheck(CardItemAdapter.OnCheckListner listner) {
        this.listner = listner;
    }
    //设置activity界面操作全选,反选按钮作用适配器
    public void setAllGoodsCheck(boolean ischeck) {
        if (ischeck) {
            tags.clear();
            for (int i = 0; i < dataBeans.size(); i++) {
                tags.add(i);
            }
        }else if(tags.size()==dataBeans.size()){
            tags.clear();
        }
        notifyDataSetChanged();
    }
    @Override
    public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_card_layout, parent, false);
        CardViewHolder holder = new CardViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final CardViewHolder holder, final int position) {
        holder.checkBox.setChecked(tags.contains(position));
        holder.title.setText(dataBeans.get(position).getSellerName());
        if(holder.recyclerView.getAdapter()==null){
            final CardItemAdapter adapter = new CardItemAdapter(context, dataBeans.get(position).getList(),tags.contains(position));
            holder.recyclerView.setAdapter(adapter);
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(context));
            adapter.setSellerCheck(new CardItemAdapter.OnCheckListner() {
                @Override
                public void setCheck(boolean isCheck) {
                    holder.checkBox.setChecked(isCheck);
                }

                @Override
                public void getTotal(double item) {
                    map.put(position,item);
                    double price=0;
                    for(int i=0;i<dataBeans.size();i++){
                        if(map.get(i)!=null){
                            price+=map.get(i);
                        }
                    }
                    listner.getTotal(price);
                }
            });
            //商家勾选作用于所有商品
            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    //影响内部recyclerview
                    adapter.setAllGoodsCheck(isChecked);



                    //影响外部activity的全选按钮
                    if (isChecked) {//选中,将position放入
                        if (!tags.contains(position)) {
                            tags.add(position);
                        }
                    } else if (tags.contains(position)) {
                        tags.remove((Integer) position);
                    }
                    if (tags.size() == dataBeans.size()) {//代表当前商家选中所有商品
                        listner.setCheck(true);
                    } else {//代表商家没有商品被选中
                        listner.setCheck(false);
                    }
                }
            });}

    }

    @Override
    public int getItemCount() {
        return dataBeans.size();
    }

    class CardViewHolder extends RecyclerView.ViewHolder {
        private CheckBox checkBox;
        private TextView title;
        private RecyclerView recyclerView;

        public CardViewHolder(View itemView) {
            super(itemView);
            checkBox = (CheckBox) itemView.findViewById(R.id.card_sellercheck);
            recyclerView = (RecyclerView) itemView.findViewById(R.id.card_list);
            title = (TextView) itemView.findViewById(R.id.card_sellername);
        }
    }
}
(2

package com.example.tangxueqin.gouwuche_demo.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.tangxueqin.gouwuche_demo.R;
import com.example.tangxueqin.gouwuche_demo.bean.CardBean;
import com.example.tangxueqin.gouwuche_demo.view.PlusReduceView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by tangxueqin on 2018/3/5.
 */
public class CardItemAdapter extends RecyclerView.Adapter<CardItemAdapter.CardItemViewHolder>  {
    private List<CardBean.DataBean.ListBean> list = new ArrayList<>();
    private Context context;
    //存储勾选标志
    private List<Integer> tags = new ArrayList<>();

    public CardItemAdapter() {
    }

    public CardItemAdapter(Context context, List<CardBean.DataBean.ListBean> list, boolean ischek) {
        this.context = context;
        this.list = list;
        if (ischek) {
            for (int i = 0; i < list.size(); i++) {
                tags.add(i);
            }
        }

    }

    private OnCheckListner listner;

    public void setSellerCheck(OnCheckListner listner) {
        this.listner = listner;
    }

    public void setAllGoodsCheck(boolean ischeck) {
        if (ischeck) {
            tags.clear();
            for (int i = 0; i < list.size(); i++) {
                tags.add(i);
            }
        } else if (tags.size() == list.size()) {
            tags.clear();
        }
        notifyDataSetChanged();
    }

    @Override
    public CardItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_card_item, parent, false);
        CardItemViewHolder holder = new CardItemViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final CardItemViewHolder holder, final int position) {
        //初始化checkbox状态
        holder.checkBox.setChecked(tags.contains(position));
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


                if (isChecked) {//选中,将position放入
                    if (!tags.contains(position)) {
                        tags.add(position);
                    }
                } else if (tags.contains(position)) {
                    tags.remove((Integer) position);
                }
                double price = 0;
                for (int i = 0; i < tags.size(); i++) {
                    //勾选单选框,影响的价格
                    CardBean.DataBean.ListBean listBean=list.get(tags.get(i));
                    double total = listBean.getNum() * listBean.getBargainPrice();
                    price += total;
                }
                listner.getTotal(price);
                if (tags.size() == list.size()) {//代表当前商家选中所有商品
                    listner.setCheck(true);
                } else {//代表商家没有商品被选中
                    listner.setCheck(false);
                }
                //等价于 listner.setCheck(tags.size()==list.size());
            }
        });
        String url = list.get(position).getImages();
        String[] urls = url.split("\\|");
        if (urls != null && urls.length > 0) {
            url = urls[0];
        }
        Glide.with(context).load(url).into(holder.img);
        holder.title.setText(list.get(position).getTitle());
        holder.price.setText("优惠价:¥" + list.get(position).getBargainPrice());
//        holder.num.setLinster(new OnChangeListner() {
//            @Override
//            public void getSum(int item) {
//                list.get(position).setNum(item);
//                double price = 0;
//                for (int i = 0; i < tags.size(); i++) {
//                    //勾选单选框,影响的价格
//                    CardBean.DataBean.ListBean listBean=list.get(tags.get(i));
//                    double total = listBean.getNum() * listBean.getBargainPrice();
//                    price += total;
//                }
//                listner.getTotal(price);
//            }
//        });

//        holder.num.initData(list.get(position).getNum());
    }

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

    class CardItemViewHolder extends RecyclerView.ViewHolder {
        private CheckBox checkBox;
        private ImageView img;
        private TextView title, price;
        private PlusReduceView num;

        public CardItemViewHolder(View itemView) {
            super(itemView);
            checkBox = (CheckBox) itemView.findViewById(R.id.card_goodscheck);
            img = (ImageView) itemView.findViewById(R.id.card_goodsimg);
            title = (TextView) itemView.findViewById(R.id.card_goodsname);
            price = (TextView) itemView.findViewById(R.id.card_goodsprice);
           // num = (PlusReduceView) itemView.findViewById(R.id.card_goodsnum);
        }
    }

    public interface OnCheckListner {
        void setCheck(boolean isCheck);

        void getTotal(double item);
    }

    public interface OnChangeListner {

        void getSum(int item);
    }
}

(3

package com.example.tangxueqin.gouwuche_demo.adapter;

import android.view.View;

/**
 * Created by tangxueqin on 2018/3/3.
 */
public interface OnItemClickListner {
    void onItemClick(View view, String cid);
}

7.MainActivity

package com.example.tangxueqin.gouwuche_demo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import com.example.tangxueqin.gouwuche_demo.adapter.CardAdapter;
import com.example.tangxueqin.gouwuche_demo.adapter.CardItemAdapter;
import com.example.tangxueqin.gouwuche_demo.bean.CardBean;
import com.example.tangxueqin.gouwuche_demo.persenter.CardPresenter;
import com.example.tangxueqin.gouwuche_demo.view.ICardView;

import java.util.List;

public class MainActivity extends AppCompatActivity implements ICardView {
    private RecyclerView recyclerView;
    private CardAdapter adapter;
    private CardPresenter presenter;
    private CheckBox checkBox;
    private TextView textView;
    private Button button;
    private double price=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.third_list);
        checkBox = (CheckBox) findViewById(R.id.all_check);
        textView = (TextView) findViewById(R.id.total_price);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        presenter = new CardPresenter();
        presenter.attachView(this);
        presenter.showCardList();

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                adapter.setAllGoodsCheck(isChecked);
            }
        });
    }

    @Override
    public void showCardList(List<CardBean.DataBean> dataBeans) {
        if (dataBeans != null) {
            adapter = new CardAdapter(dataBeans, MainActivity.this);
            recyclerView.setAdapter(adapter);
            adapter.setSellerCheck(new CardItemAdapter.OnCheckListner() {
                @Override
                public void setCheck(boolean isCheck) {
                   // checkBox.setChecked(isCheck);
                }

                @Override
                public void getTotal(double item) {
                   // textView.setText(item+"");
                }
            });
        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值