1activity_main.xml页面布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".activity.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/text_jiesuan"
/>
<CheckBox
android:id="@+id/query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/recycle_view"
app:layout_constraintBottom_toBottomOf="parent"
/>
<TextView
android:id="@+id/text_query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/query"
app:layout_constraintBottom_toBottomOf="@id/query"
app:layout_constraintTop_toTopOf="@id/query"
android:textSize="20sp"
android:text="全选/反选"
/>
<TextView
android:id="@+id/text_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/recycle_view"
app:layout_constraintLeft_toRightOf="@id/text_query"
android:layout_marginLeft="10dp"
android:text="总价:¥0元"
android:textColor="#f00"
android:textSize="18sp"
/>
<TextView
android:id="@+id/text_shopp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/text_total"
app:layout_constraintLeft_toRightOf="@id/text_query"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginLeft="10dp"
android:text="共0件商品"
android:textSize="18sp"
/>
<TextView
android:id="@+id/text_jiesuan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/recycle_view"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="去结算"
android:textSize="26sp"
android:background="@drawable/button_shape"
android:gravity="center"
/>
</android.support.constraint.ConstraintLayout>
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="match_parent"
android:orientation="horizontal"
>
<ImageButton
android:id="@+id/jian"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/ic_jian_name"
/>
<EditText
android:id="@+id/ed_num"
android:layout_width="50dp"
android:layout_height="50dp"
android:text="1"
android:textSize="24sp"
android:inputType="number"
android:background="@drawable/edit_shape"
/>
<ImageButton
android:id="@+id/add"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/ic_add_name"
/>
</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:orientation="vertical"
android:padding="15dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<CheckBox
android:id="@+id/shop_check"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/shopp_commodity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="shopp_commodity"
android:textSize="24sp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
>
<CheckBox
android:id="@+id/item_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/item_image"
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@mipmap/ic_launcher"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:orientation="vertical"
android:layout_weight="1"
>
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:textSize="18sp"
android:text="name"
android:maxLines="2"
/>
<TextView
android:id="@+id/item_price"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:textSize="18sp"
android:text="price"
android:textColor="#f00"
/>
<com.example.shoppingcart01.custom.CustomView
android:id="@+id/custom"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
/>
</LinearLayout>
<ImageView
android:id="@+id/item_del"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/ic_del_name"
/>
</LinearLayout>
</LinearLayout>
4.两个shape页面
4.1加减器shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp"/>
<solid android:color="#fff"/>
<size android:height="45dp" android:width="45dp"/>
</shape>
4.2button的shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="200dp"/>
<solid android:color="#0ff"/>
<size android:width="130dp" android:height="60dp"/>
</shape>
5.Bean类 里面需要自己写三个属性代码中有注释
package com.example.shoppingcart01.bean;
import java.util.List;
public class ShoppBean {
private String msg;
private String code;
private List<DataBean> data;
private final String SUCCESS_CODE="0";
public boolean isSuccess(){
return code.equals(SUCCESS_CODE);
}
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 {
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 {
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;
//1为显示商铺, 2为隐藏商铺
private int isFirst = 1;
//每个商品的选中状态
private boolean item_check;
//商店的选中状态
private boolean shop_check;
public int getIsFirst() {
return isFirst;
}
public void setIsFirst(int isFirst) {
this.isFirst = isFirst;
}
public boolean isItem_check() {
return item_check;
}
public void setItem_check(boolean item_check) {
this.item_check = item_check;
}
public boolean isShop_check() {
return shop_check;
}
public void setShop_check(boolean shop_check) {
this.shop_check = shop_check;
}
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;
}
}
}
}
6.自定义加减器的view
package com.example.shoppingcart01.custom;
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.ImageButton;
import android.widget.LinearLayout;
import com.example.shoppingcart01.R;
public class CustomView extends LinearLayout {
private ImageButton jian;
private ImageButton add;
private EditText editText;
private int mCount = 1;
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
View view = View.inflate(context,R.layout.custom_item,this);
jian = view.findViewById(R.id.jian);
add = view.findViewById(R.id.add);
editText = view.findViewById(R.id.ed_num);
//减
jian.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String content = editText.getText().toString().trim();
Integer count = Integer.valueOf(content);
if(count>1){
mCount = count-1;
editText.setText(mCount+"");
//回调给adapter里面
if(customListener!=null){
customListener.jianjian(mCount);
}
}
}
});
//加
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String content = editText.getText().toString().trim();
Integer count = Integer.valueOf(content)+1;
mCount = count;
editText.setText(mCount+"");
//回调给adapter里面
if(customListener!=null){
customListener.jianjian(mCount);
}
}
});
//输入框
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//TODO
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
private CustomListener customListener;
public void setCustomListener(CustomListener customListener){
this.customListener = customListener;
}
//定义接口加减
public interface CustomListener{
void jianjian(int count);
void shuruzhi(int count);
}
//这个方法共adaper设置数量时调用
public void setEditText(int num){
if(editText!=null){
editText.setText(num+"");
}
}
}
7.适配器页面(这里操作的任务比较多)
package com.example.shoppingcart01.adaper;
import android.content.Context;
import android.support.annotation.NonNull;
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.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.shoppingcart01.R;
import com.example.shoppingcart01.bean.ShoppBean;
import com.example.shoppingcart01.custom.CustomView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Handler;
public class ShopAdaper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<ShoppBean.DataBean.ListBean> list;
//存放商家id和商家名称的map集合
private Map<String,String> map = new HashMap<>();
public ShopAdaper(Context mContext) {
this.mContext = mContext;
}
/**
* 添加数据并更新显示
* */
public void add(ShoppBean shoppBean){
//传进来的是bean对象
if(list == null){
list = new ArrayList<>();
}
//第一层遍历商家和商品
for(ShoppBean.DataBean bean:shoppBean.getData()){
//把商品的id和商品的名称添加到map集合里 ,,为了之后方便调用
map.put(bean.getSellerid(),bean.getSellerName());
//第二层遍历里面的商品
for(int i = 0;i<bean.getList().size();i++){
//添加到list集合里
list.add(bean.getList().get(i));
}
}
//调用方法 设置显示或隐藏 商铺名
setFirst(list);
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.shopp_item,viewGroup,false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
/**
* 设置商铺的 shop_checkbox和商铺的名字 显示或隐藏
* */
final MyViewHolder holder = (MyViewHolder) viewHolder;
if(list.get(i).getIsFirst() == 1){
//显示商家
holder.shop_check.setVisibility(View.VISIBLE);
holder.shopp_commodity.setVisibility(View.VISIBLE);
//设置选中状态
holder.shop_check.setChecked(list.get(i).isShop_check());
holder.shopp_commodity.setText(map.get(String.valueOf(list.get(i).getSellerid())));
}else{
//隐藏
holder.shop_check.setVisibility(View.GONE);
holder.shopp_commodity.setVisibility(View.GONE);
}
//拆分images字段
String[] str = list.get(i).getImages().split("\\|");
//设置商品的图片
Glide.with(mContext).load(str[0]).into(holder.item_image);
//控制商品的checkbox,根据字段改变
holder.item_check.setChecked(list.get(i).isItem_check());
holder.item_name.setText(list.get(i).getTitle());
holder.item_price.setText(list.get(i).getPrice()+"");
//调用customview里的方法设置加减号中间的数字
holder.custom.setEditText(list.get(i).getNum());
//商铺的shop_checkbox点击事件 ,控制商品的item_checkbox
holder.shop_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先改变数据源中的shop_check
list.get(i).setShop_check(holder.shop_check.isChecked());
for(int a = 0;a<list.size();a++){
//如果是同一家商铺的 都给成相同状态
if(list.get(i).getSellerid() == list.get(a).getSellerid()){
//当前条目的选中状态 设置成 当前商铺的选中状态
list.get(a).setItem_check(holder.shop_check.isChecked());
}
}
//刷新适配器
notifyDataSetChanged();
//调用求和的方法
sum(list);
}
});
//商品的item_checkbox点击事件,控制商铺的shop_checkbox
holder.item_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先改变数据源中的item_checkbox
list.get(i).setItem_check(holder.item_check.isChecked());
//反向控制商铺的shop_checkbox
for(int s = 0;s<list.size();s++){
for(int j = 0;j<list.size();j++){
//如果两个商品是同一家店铺的 并且 这两个商品的item_checkbox选中状态不一样
if(list.get(s).getSellerid() == list.get(j).getSellerid()&&!list.get(j).isItem_check()){
//就把商铺的shop_checkbox改成false
list.get(s).setShop_check(false);
break;
}else{
//同一家商铺的商品 选中状态都一样,就把商铺shop_checkbox状态改成true
list.get(s).setShop_check(true);
}
}
}
//更新适配器
notifyDataSetChanged();
//调用求和的方法
sum(list);
}
});
//删除条目的点击事件
holder.item_del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//移除集合中的当前数据
list.remove(i);
//删除完当前的条目 重新判断商铺的显示隐藏
setFirst(list);
//调用重新求和
sum(list);
notifyDataSetChanged();
}
});
//加减号的监听,
holder.custom.setCustomListener(new CustomView.CustomListener() {
@Override
public void jianjian(int count) {
//改变数据源中的数量
list.get(i).setNum(count);
notifyDataSetChanged();
sum(list);
}
//输入值 求总价
@Override
public void shuruzhi(int count) {
list.get(i).setNum(count);
notifyDataSetChanged();
sum(list);
}
});
}
/**
* 设置数据源,控制是否显示商家
* */
private void setFirst(List<ShoppBean.DataBean.ListBean> list) {
if(list.size()>0){
//如果是第一条数据就设置isFirst为1
list.get(0).setIsFirst(1);
//从第二条开始遍历
for(int i=1;i<list.size();i++){
//如果和前一个商品是同一家商店的
if(list.get(i).getSellerid() == list.get(i-1).getSellerid()){
//设置成2不显示商铺
list.get(i).setIsFirst(2);
}else{
//设置成1显示商铺
list.get(i).setIsFirst(1);
//如果当前条目选中,把当前的商铺也选中
if(list.get(i).isItem_check() == true){
list.get(i).setShop_check(list.get(i).isItem_check());
}
}
}
}
}
//求和的方法
private void sum(List<ShoppBean.DataBean.ListBean> list) {
//初始的总价为0
int totalNum = 0;
double totalPrice = 0.0;
boolean allCheck = true;
for(int i = 0;i<list.size();i++){
//把 已经选中的 条目 计算价格
if(list.get(i).isItem_check()){
totalNum += list.get(i).getNum();
totalPrice+= list.get(i).getNum()*list.get(i).getPrice();
}else{
//如果有个未选中,就标记为false
allCheck = false;
}
}
//接口回调出去 把总价 总数量 和allcheck 传给view层
updateListener.setTotal(totalPrice+"",totalNum+"",allCheck);
}
//view层调用这个方法, 点击quanxuan按钮的操作
public void queryAll(boolean checked){
for(int i = 0;i<list.size();i++){
list.get(i).setShop_check(checked);
list.get(i).setItem_check(checked);
}
notifyDataSetChanged();
sum(list);
}
@Override
public int getItemCount() {
return list==null?0:list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
public final CheckBox shop_check;
public final TextView shopp_commodity;
public final CheckBox item_check;
public final ImageView item_image;
public final TextView item_name;
public final TextView item_price;
public final CustomView custom;
public final ImageView item_del;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
shop_check = itemView.findViewById(R.id.shop_check);
shopp_commodity = itemView.findViewById(R.id.shopp_commodity);
item_check = itemView.findViewById(R.id.item_check);
item_image = itemView.findViewById(R.id.item_image);
item_name = itemView.findViewById(R.id.item_name);
item_price = itemView.findViewById(R.id.item_price);
custom = itemView.findViewById(R.id.custom);
item_del = itemView.findViewById(R.id.item_del);
}
}
private UpdateListener updateListener;
public void setUpdateListener(UpdateListener updateListener){
this.updateListener = updateListener;
}
//定义接口
public interface UpdateListener{
void setTotal(String total,String num,boolean allCheck);
}
}
8.MainActivity页面
package com.example.shoppingcart01.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import com.example.shoppingcart01.R;
import com.example.shoppingcart01.adaper.ShopAdaper;
import com.example.shoppingcart01.apis.Apis;
import com.example.shoppingcart01.bean.ShoppBean;
import com.example.shoppingcart01.presenter.PresenterImpl;
import com.example.shoppingcart01.view.Iview;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements Iview {
private PresenterImpl presenter;
private RecyclerView recyclerView;
private CheckBox query;
private TextView text_total;
private TextView text_shopp;
private ShopAdaper adaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new PresenterImpl(this);
initView();
}
private void initView() {
//获取资源id
recyclerView = findViewById(R.id.recycle_view);
query = findViewById(R.id.query);
text_total = findViewById(R.id.text_total);
text_shopp = findViewById(R.id.text_shopp);
//1为不选中
query.setTag(1);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(OrientationHelper.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
//创建适配器
adaper = new ShopAdaper(this);
recyclerView.setAdapter(adaper);
//调用适配器里的接口
adaper.setUpdateListener(new ShopAdaper.UpdateListener() {
@Override
public void setTotal(String total, String num, boolean allCheck) {
//设置ui的改变
text_shopp.setText("共"+num+"件商品");
text_total.setText("总价:¥"+total+"元");
if(allCheck){
query.setTag(2);
}else{
query.setTag(1);
}
query.setChecked(allCheck);
}
});
//这里只做ui更改, 点击全选按钮,,调到adapter里面操作
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用adapter里面的方法 ,,把当前quanxuan状态传递过去
int tag = (int) query.getTag();
if(tag == 1){
query.setTag(2);
}else{
query.setTag(1);
}
adaper.queryAll(query.isChecked());
}
});
//请求网址
Map<String,String> map = new HashMap<>();
map.put("uid","71");
presenter.startRequest(Apis.URL_SHOPP_CART,map,ShoppBean.class);
}
@Override
public void requestData(Object o) {
if(o instanceof ShoppBean){
ShoppBean bean = (ShoppBean) o;
if(bean==null || !bean.isSuccess()){
Toast.makeText(MainActivity.this,bean.getMsg(),Toast.LENGTH_SHORT).show();
}else{
adaper.add(bean);
}
}
}
@Override
public void requestFail(Object o) {
if(o instanceof Exception){
Exception e = (Exception) o;
e.printStackTrace();
}
Toast.makeText(MainActivity.this,"网络请求错误",Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDetach();
}
}
详细代码 请访问一下链接
https://github.com/guoxinyu1995/yuekao/tree/master/shoppingcart01