MVP购物车(全选/反选/总价)
//效果
//依赖
//MetrialDesign:Design库
implementation 'com.android.support:design:28.+'
//Butterknife:根据反射注入框架
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//Brvah:RecyclerView快速开发框架
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
//SmartRefreshLayout
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-19'
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-19'
//没有使用特殊Header,可以不加这行
//okgo
//必须使用
implementation 'com.lzy.net:okgo:3.0.4'
implementation 'com.google.code.gson:gson:2.8.5'
//图片加载框架
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
//布局就不写了
//创建mvp
//契约类 --不做过多解释
public class IShoppContent {
//v
public interface ShoppView{
//数据刷新
public void showData(String responseShoppData);
}
//P
public interface ShoppPersent<ShoppView>{
//绑定
public void attchView(ShoppView shoppView);
//解绑
public void deachView(ShoppView shoppView);
//M 请求的数据
public void requestData();
}
///M
public interface ShoppModel{
//方法
public void getewquestData(CallBack callBack);
//接口回调
public interface CallBack{
public void onCallBack(String responseShoppData);
}
}
}
//P
public class ShoppPresentImpl implements IShoppContent.ShoppPersent<IShoppContent.ShoppView> {
IShoppContent.ShoppView shoppView;
private SoftReference<IShoppContent.ShoppView> softReference;
private IShoppContent.ShoppModel shoppModel;
@Override
public void attchView(IShoppContent.ShoppView shoppView) {
this.shoppView = shoppView;
softReference = new SoftReference<>(shoppView);
shoppModel = new ShoppModelImpl();
}
@Override
public void deachView(IShoppContent.ShoppView shoppView) {
softReference.clear();
}
@Override
public void requestData() {
shoppModel.getewquestData(new IShoppContent.ShoppModel.CallBack() {
@Override
public void onCallBack(String responseShoppData) {
shoppView.showData(responseShoppData);
}
});
}
}
M
public class ShoppModelImpl implements IShoppContent.ShoppModel {
@Override
public void getewquestData(final CallBack callBack) {
OkGo.<String>get(Contants.SHOPPINGCART_URL).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String responseShoppData = response.body().toString();
callBack.onCallBack(responseShoppData);
}
});
}
}
V
public class MainActivity extends AppCompatActivity implements IShoppContent.ShoppView, View.OnClickListener {
@BindView(R.id.main_rv_business)
RecyclerView mainRvBusiness;
@BindView(R.id.main_smartRefreshLayout)
SmartRefreshLayout mainSmartRefreshLayout;
@BindView(R.id.main_allcheck)
CheckBox mainAllcheck;
@BindView(R.id.main_btn_jie)
Button mainBtnJie;
@BindView(R.id.main_tv_money)
TextView mainTvMoney;
private IShoppContent.ShoppPersent shoppPresent;
private List<ShoppBean.DataBean> data;
private BusinAdapter adapter;
private AlertDialog alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
shoppPresent = new ShoppPresentImpl();
shoppPresent.attchView(this);
//触发事件
shoppPresent.requestData();
}
@Override
public void showData(String responseShoppData) {
mainAllcheck.setOnClickListener(null);
mainAllcheck.setOnClickListener(this);
Gson gson = new Gson();
Log.e("gs", "解析的---------responseShoppData: "+responseShoppData);
ShoppBean shoppBean = gson.fromJson(responseShoppData, ShoppBean.class);
data = shoppBean.getData();
//设置适配器
LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL,false);
mainRvBusiness.setLayoutManager(manager);
adapter = new BusinAdapter(R.layout.business_layout, data);
mainRvBusiness.setAdapter(adapter);
adapter.setOnBusinessItemClickLisenter(new BusinAdapter.OnBusinessItemClickLisenter() {
@Override
public void onCallBack() {
boolean result = true;
for (int i = 0; i < data.size(); i++) {
//层
boolean businessChecked = data.get(i).getBusinessChecked();
result = result & businessChecked;
for (int j = 0; j < data.get(i).getList().size() ; j++) {
boolean goodsChecked = data.get(i).getList().get(j).getGoodsChecked();
result = result & goodsChecked;
}
}
mainAllcheck.setChecked(result);
//计算总价
calculateTotalCount();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
shoppPresent.deachView(this);
}
@Override
public void onClick(View v) {
for (int i = 0; i <data.size() ; i++) {
data.get(i).setBusinessChecked(mainAllcheck.isChecked());
for (int j = 0; j <data.get(i).getList().size() ; j++) {
data.get(i).getList().get(j).setGoodsChecked(mainAllcheck.isChecked());
}
}
adapter.notifyDataSetChanged();
//计算总价
calculateTotalCount();
}
}
private void calculateTotalCount() {
//对项目总价进行计算
double totalCount =0;
for (int i = 0; i < data.size(); i++) {
for (int j = 0; j <data.get(i).getList().size() ; j++) {
//判断是否选中的
if (data.get(i).getList().get(j).getGoodsChecked() ==true){
double price = data.get(i).getList().get(j).getPrice();
int defalutNumber = data.get(i).getList().get(j).getDefalutNumber();
double goodsprice =price*defalutNumber;
totalCount +=goodsprice;
}
}
}
mainTvMoney.setText("总价是:"+totalCount);
}
//商家的适配器
public class BusinAdapter extends BaseQuickAdapter<ShoppBean.DataBean,BaseViewHolder> {
OnBusinessItemClickLisenter onBusinessItemClickLisenter;
public interface OnBusinessItemClickLisenter{
public void onCallBack();
}
public void setOnBusinessItemClickLisenter(OnBusinessItemClickLisenter onBusinessItemClickLisenter){
this.onBusinessItemClickLisenter = onBusinessItemClickLisenter;
}
public BusinAdapter(int layoutResId, @Nullable List<ShoppBean.DataBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, final ShoppBean.DataBean item) {
//设置商家名称
helper.setText(R.id.busin_name,item.getSellerName());
//获取子布局
RecyclerView goodsrv = helper.getView(R.id.busin_rv_goods);
//避免焦点抢占
final CheckBox busin_check = helper.getView(R.id.busin_check);
busin_check.setOnCheckedChangeListener(null);
//获取商家条目是否选中状态
busin_check.setChecked(item.getBusinessChecked());
final ArrayList<ShoppBean.DataBean.ListBean> goodslist = (ArrayList<ShoppBean.DataBean.ListBean>) item.getList();
LinearLayoutManager manager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
goodsrv.setLayoutManager(manager);
final GoodsAdapter adapter = new GoodsAdapter(R.layout.goods_layout,goodslist);
goodsrv.setAdapter(adapter);
adapter.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();
}
busin_check.setChecked(result);
adapter.notifyDataSetChanged();
onBusinessItemClickLisenter.onCallBack();
}
});
busin_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i <item.getList().size() ; i++) {
item.getList().get(i).setGoodsChecked(busin_check.isChecked());
}
item.setBusinessChecked(busin_check.isChecked());
adapter.notifyDataSetChanged();
onBusinessItemClickLisenter.onCallBack();
}
});
}
}
//商品的适配器
public class GoodsAdapter extends BaseQuickAdapter<ShoppBean.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<ShoppBean.DataBean.ListBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, final ShoppBean.DataBean.ListBean item) {
helper.setText(R.id.goods_name,item.getTitle());
helper.setText(R.id.goods_money,"$:"+item.getPrice());
ImageView imageView = helper.getView(R.id.goods_imageView);
String imageStr = item.getImages();
String[] goods = imageStr.split("\\|");
// Log.e("gs", "goods: ."+goods );
Glide.with(mContext).load(goods[0]).into(imageView);
//避免焦点抢占
CheckBox goods_checkBox = helper.getView(R.id.goods_checkBox);
goods_checkBox.setOnCheckedChangeListener(null);
goods_checkBox.setChecked(item.getGoodsChecked());
goods_checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
item.setGoodsChecked(isChecked);
onGoodsItemClickLisenter.onCallBack();
}
});
//加减
CalcutorView calcutorView = helper.getView(R.id.goods_calcu);
calcutorView.setOnCalCulatorLisenter(new CalcutorView.OnCalCulatorLisenter() {
@Override
public void onJian(int nums) {
//对新增的字段进行改动
item.setDefalutNumber(nums);
onGoodsItemClickLisenter.onCallBack();
}
@Override
public void onAdd(int nums) {
//对新增的字段进行改动
item.setDefalutNumber(nums);
onGoodsItemClickLisenter.onCallBack();
}
});
}
}
//自动加减的view
public class CalcutorView extends LinearLayout implements View.OnClickListener {
private Button add;
private Button jian;
private EditText snum;
public CalcutorView(Context context) {
super(context);
}
public CalcutorView(Context context, AttributeSet attrs) {
super(context, attrs);
View rootView = LayoutInflater.from(context).inflate(R.layout.calculator_layout, this);
//获取地
add = rootView.findViewById(R.id.calcu_jia);
jian = rootView.findViewById(R.id.calcu_jian);
snum = rootView.findViewById(R.id.calcu_num);
add.setOnClickListener(this);
jian.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String numStr = snum.getText().toString();
int nums = Integer.parseInt(numStr);
switch (v.getId()){
case R.id.calcu_jian:
nums -=1;
if (nums<0){
nums=0;
snum.setText(String.valueOf(nums));
}
snum.setText(String.valueOf(nums));
//接口回穿数据
onCalCulatorLisenter.onJian(nums);
break;
case R.id.calcu_jia:
nums +=1;
snum.setText(String.valueOf(nums));
onCalCulatorLisenter.onAdd(nums);
break;
}
}
OnCalCulatorLisenter onCalCulatorLisenter;
//方法
public interface OnCalCulatorLisenter {
//减
public void onJian(int nums);
//加
public void onAdd(int nums);
}
public void setOnCalCulatorLisenter(OnCalCulatorLisenter onCalCulatorLisenter){
this.onCalCulatorLisenter = onCalCulatorLisenter;
}
}
注意: 看看 自己的bean类中是否 有 选中的类 和价钱的初始数据
如果没有自己添加 写setget,方法