主页面
package com.android.alex.shoppingcartdemo.ui.activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.android.alex.shoppingcartdemo.R;
import com.android.alex.shoppingcartdemo.data.beans.ShoppingCartBean;
import com.android.alex.shoppingcartdemo.di.contract.ShoppingCartContract;
import com.android.alex.shoppingcartdemo.di.presenter.ShoppingCartPresenter;
import com.android.alex.shoppingcartdemo.ui.adapter.BusinessAdapter;
import com.google.gson.Gson;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class ShoppingCartActivity extends AppCompatActivity implements ShoppingCartContract.IView, View.OnClickListener {
@BindView(R.id.rv_business)
RecyclerView rvBusiness;
@BindView(R.id.srl_container)
com.scwang.smartrefresh.layout.SmartRefreshLayout srlContainer;
@BindView(R.id.cb_all)
CheckBox cbAll;
@BindView(R.id.btn_price)
Button btnPrice;
@BindView(R.id.tv_count)
TextView tvCount;
private ShoppingCartContract.IPresenter presenter;
private Context mContext;
private List<ShoppingCartBean.DataBean> businessList;
private BusinessAdapter adapter;
private AlertDialog alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mContext = this;
//获取P层
presenter = new ShoppingCartPresenter();
presenter.attachView(this);
presenter.requestData();
//对上下拉的处理
srlContainer.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
presenter.requestData();
refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
}
});
srlContainer.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(RefreshLayout refreshlayout) {
refreshlayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
}
});
}
@Override
public void showLoading() {
alertDialog = new AlertDialog.Builder(mContext) .setMessage("刷新中").create();
alertDialog.show();
}
@Override
public void hideLoading() {
alertDialog.hide();
}
@Override
public void showData(String mCartString) {
cbAll.setOnCheckedChangeListener(null);
//全选反选的处理
//cbAll.setOnCheckedChangeListener(this);
cbAll.setOnClickListener(this);
//数据解析展示
ShoppingCartBean cartBean = new Gson().fromJson(mCartString, ShoppingCartBean.class);
//外层商家条目的数据源
businessList = cartBean.getData();
//TODO 不建议这样处理,手动移除第一个条目
//设置布局管理器
LinearLayoutManager manager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
rvBusiness.setLayoutManager(manager);
//设置适配器
adapter = new BusinessAdapter(R.layout.recycler_business_item, businessList);
rvBusiness.setAdapter(adapter);
adapter.setOnBusinessItemClickLisenter(new BusinessAdapter.OnBusinessItemClickLisenter() {
@Override
public void onCallBack() {
boolean result = true;
for (int i = 0; i < businessList.size(); i++) {
//外层选中状态
boolean businessChecked = businessList.get(i).getBusinessChecked();
result = result & businessChecked;
for (int j = 0; j < businessList.get(i).getList().size(); j++) {
//里层选中状态
boolean goodsChecked = businessList.get(i).getList().get(j).getGoodsChecked();
result = result & goodsChecked;
}
}
cbAll.setChecked(result);
//计算总价
calculateTotalCount();
}
});
}
private void calculateTotalCount() {
//对总价进行计算
double totalCount = 0;
//外层条目
for (int i = 0; i < businessList.size(); i++) {
//内层条目
for (int j = 0; j < businessList.get(i).getList().size(); j++) {
//判断内层条目是否勾选
if (businessList.get(i).getList().get(j).getGoodsChecked() == true){
//获取商品数据*商品价格
double price = businessList.get(i).getList().get(j).getPrice();
int defalutNumber = businessList.get(i).getList().get(j).getDefalutNumber();
double goodsPrice = price * defalutNumber;
totalCount = totalCount+goodsPrice;
}
}
}
tvCount.setText("总价是:"+String.valueOf(totalCount));
}
@OnClick(R.id.btn_price)
public void onViewClicked() {
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView(this);
}
/* @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//全选逻辑的处理
for (int i = 0; i < businessList.size(); i++) {
//首先让外层的商家条目全部选中
businessList.get(i).setBusinessChecked(isChecked);
//然后让里层的商品条目全部选中
for (int j = 0; j < businessList.get(i).getList().size(); j++) {
businessList.get(i).getList().get(j).setGoodsChecked(isChecked);
}
}
adapter.notifyDataSetChanged();
}*/
@Override
public void onClick(View v) {
//全选逻辑的处理
for (int i = 0; i < businessList.size(); i++) {
//首先让外层的商家条目全部选中
businessList.get(i).setBusinessChecked(cbAll.isChecked());
//然后让里层的商品条目全部选中
for (int j = 0; j < businessList.get(i).getList().size(); j++) {
businessList.get(i).getList().get(j).setGoodsChecked(cbAll.isChecked());
}
}
adapter.notifyDataSetChanged();
//计算总价
calculateTotalCount();
}
}
Badapter
package com.android.alex.shoppingcartdemo.ui.adapter;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import com.android.alex.shoppingcartdemo.R;
import com.android.alex.shoppingcartdemo.data.beans.ShoppingCartBean;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import java.util.List;
/**
* @author Alex
* @date 2019/1/15.
* GitHub:https://github.com/wangshuaialex
*/
public class BusinessAdapter extends BaseQuickAdapter<ShoppingCartBean.DataBean, BaseViewHolder> {
OnBusinessItemClickLisenter onBusinessItemClickLisenter;
public interface OnBusinessItemClickLisenter {
public void onCallBack();
}
public void setOnBusinessItemClickLisenter(OnBusinessItemClickLisenter onBusinessItemClickLisenter) {
this.onBusinessItemClickLisenter = onBusinessItemClickLisenter;
}
public BusinessAdapter(int layoutResId, @Nullable List<ShoppingCartBean.DataBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, final ShoppingCartBean.DataBean item) {
//设置商家名称
helper.setText(R.id.tv_business_name, item.getSellerName());
//设置商家下的子商品条目
RecyclerView rv_goods = helper.getView(R.id.rv_goods);
//避免焦点抢占
final CheckBox cb_business = helper.getView(R.id.cb_business);
cb_business.setOnCheckedChangeListener(null);
//************************************
//获取商家条目是否选中状态
cb_business.setChecked(item.getBusinessChecked());
//子商品条目数据源
List<ShoppingCartBean.DataBean.ListBean> goodsList = item.getList();
LinearLayoutManager manager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
//设置子条目适配器
final GoodsAdapter goodsAdapter = new GoodsAdapter(R.layout.recycler_goods_item, goodsList);
rv_goods.setLayoutManager(manager);
rv_goods.setAdapter(goodsAdapter);
//首先处理内部子条目控制外部条目
goodsAdapter.setOnGoodsItemClickLisenter(new GoodsAdapter.OnGoodsItemClickLisenter() {
@Override
public void onCallBack() {
//遍历获取所有子条目,只要有一个未勾选,商品类别也应该是未勾选
boolean result = true;
for (int i = 0; i < item.getList().size(); i++) {
result = result & item.getList().get(i).getGoodsChecked();
}
cb_business.setChecked(result);
//刷新适配器
goodsAdapter.notifyDataSetChanged();
//把最后的状态进行回传
onBusinessItemClickLisenter.onCallBack();
}
});
//然后外层的商品类别条目需要控制里面的商品条目
cb_business.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取商品类别勾选状态
//外层商品类别条目获取的关键:cb_business.isChecked()
for (int i = 0; i < item.getList().size(); i++) {
item.getList().get(i).setGoodsChecked(cb_business.isChecked());
}
item.setBusinessChecked(cb_business.isChecked());
notifyDataSetChanged();
//把最后的状态进行回传
onBusinessItemClickLisenter.onCallBack();
}
});
}
}
子诗佩妮
package com.android.alex.shoppingcartdemo.ui.adapter;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import com.android.alex.shoppingcartdemo.R;
import com.android.alex.shoppingcartdemo.data.beans.ShoppingCartBean;
import com.android.alex.shoppingcartdemo.ui.widget.CalculatorView;
import com.bumptech.glide.Glide;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import java.util.List;
/**
-
@author Alex
-
@date 2019/1/15.
-
GitHub:https://github.com/wangshuaialex
*/
public class GoodsAdapter extendsBaseQuickAdapter<ShoppingCartBean.DataBean.ListBean, BaseViewHolder> {
OnGoodsItemClickLisenter onGoodsItemClickLisenter;public void setOnGoodsItemClickLisenter(OnGoodsItemClickLisenter onGoodsItemClickLisenter) { this.onGoodsItemClickLisenter = onGoodsItemClickLisenter; } //接口回调 public interface OnGoodsItemClickLisenter { public void onCallBack(); } public GoodsAdapter(int layoutResId, @Nullable List<ShoppingCartBean.DataBean.ListBean> data) { super(layoutResId, data); } @Override protected void convert(BaseViewHolder helper, final ShoppingCartBean.DataBean.ListBean item) { helper.setText(R.id.tv_goodsPrice, "¥:" + item.getPrice()); helper.setText(R.id.tv_goodsTitle, item.getTitle()); ImageView iv_goodsIcon = helper.getView(R.id.iv_goodsIcon); String imagesString = item.getImages(); String[] imagesStr = imagesString.split("\\|"); Glide.with(mContext).load(imagesStr[0]).into(iv_goodsIcon); //避免焦点抢占 final CheckBox cb_goods = helper.getView(R.id.cb_goods); cb_goods.setOnCheckedChangeListener(null); cb_goods.setChecked(item.getGoodsChecked()); //以接口的方式把状态回传给外层 cb_goods.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //Bean对象状态进行更新完毕 item.setGoodsChecked(isChecked); onGoodsItemClickLisenter.onCallBack(); } }); //加减器 CalculatorView calculatorView = helper.getView(R.id.cv_calculatorView); calculatorView.setOnCalCulatorLisenter(new CalculatorView.OnCalCulatorLisenter() { @Override public void onDecrese(int number) { //对新增的字段进行改动 item.setDefalutNumber(number); onGoodsItemClickLisenter.onCallBack(); } @Override public void onAdd(int number) { //对新增的字段进行改动 item.setDefalutNumber(number); onGoodsItemClickLisenter.onCallBack(); } }); }
}
加减器
package com.android.alex.shoppingcartdemo.ui.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.alex.shoppingcartdemo.R;
/**
-
@author Alex
-
@date 2019/1/16.
-
GitHub:https://github.com/wangshuaialex
*/
public class CalculatorView extends LinearLayout implements View.OnClickListener { -
private Button btn_add;
private Button btn_decrease;
private TextView tv_number;public CalculatorView(Context context, AttributeSet attrs) { super(context, attrs); //填充的条目布局 View rootView = LayoutInflater.from(context).inflate(R.layout.calculator_layout,
this);
btn_add = rootView.findViewById(R.id.btn_add);
btn_decrease = rootView.findViewById(R.id.btn_decrease);
tv_number = rootView.findViewById(R.id.tv_number);
btn_add.setOnClickListener(this);
btn_decrease.setOnClickListener(this);
}@Override public void onClick(View v) { String numberString = tv_number.getText().toString(); int number = Integer.parseInt(numberString); switch (v.getId()) { case R.id.btn_decrease: number = number - 1; if (number < 0) { number = 0; //最小数量为0 tv_number.setText(String.valueOf(number)); } tv_number.setText(String.valueOf(number)); //接口回调回传数字 onCalCulatorLisenter.onDecrese(number); break; case R.id.btn_add: number = number + 1; tv_number.setText(String.valueOf(number)); //接口回调回传数字 onCalCulatorLisenter.onAdd(number); break; } } OnCalCulatorLisenter onCalCulatorLisenter; public interface OnCalCulatorLisenter { //减少 public void onDecrese(int number); //增加 public void onAdd(int number); } public void setOnCalCulatorLisenter(OnCalCulatorLisenter onCalCulatorLisenter) { this.onCalCulatorLisenter = onCalCulatorLisenter; }
}
加减去的布局
<Button
android:id="@+id/btn_decrease"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:background="@mipmap/decrease"
android:padding="@dimen/dp_10" />
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:inputType="number"
android:text="@string/hint_number" />
<Button
android:id="@+id/btn_add"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:background="@mipmap/add"
android:padding="@dimen/dp_10" />