添加网络权限
添加依赖
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+"");
}
});
}
}
}