购物车-逻辑(全选+价格联动)

本文介绍了一个购物车的实现,包括网络请求API接口、使用Retrofit、MVP模式、Fresco库的初始化,以及自定义加减器。在布局中使用了RecyclerView和CheckBox实现商品列表,通过点击全选按钮实现商品的全选和价格联动计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先写网络封装+工具类

APi
public interface Api {
@GET(“ks/product/getCarts?uid=51”)
Observable getgouwuche();

}

Retrofit
public class Ulit {

public Api api;
private static final Ulit ULIT = new Ulit();

public Ulit() {

}

public static Ulit getdan() {
    return ULIT;
}

public void getUlit() {
    Retrofit build = new Retrofit.Builder()
            .baseUrl("http://172.17.8.100/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
    api = build.create(Api.class);

}

}

MVP
interface接口
public interface IManintenter {
void getintenter(GouWuChBean gouWuChBean);
}

Presenter
public class GouWuChePager {
Shou1Fragmenter fragmenter;
private final Ulit getdan;

public GouWuChePager(Shou1Fragmenter fragmenter1) {
    this.fragmenter = fragmenter1;
    getdan = Ulit.getdan();
}

public void getgouwuchepresenter() {
    getdan.getUlit();
    getdan.api.getgouwuche().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<GouWuChBean>() {
                @Override
                public void accept(GouWuChBean gouWuChBean) throws Exception {
                    fragmenter.getintenter(gouWuChBean);
                }
            });
}

}

Fresco的工具App .name注册
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
自定义加减器
布局






public class JiaJianQi extends LinearLayout {

private Button jia;
private Button jian;
private TextView shuliang;

public JiaJianQi(Context context) {
    super(context);
}

public JiaJianQi(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater.from(context).inflate(R.layout.zidingyilayout, this);
    jia = findViewById(R.id.jia);
    jian = findViewById(R.id.jian);
    shuliang = findViewById(R.id.shuliang);
}

public void setJia(OnClickListener jia1) {
    jia.setOnClickListener(jia1);
}

public void setJian(OnClickListener jian1) {
    jian.setOnClickListener(jian1);
}

public void setShuliang(String shuliang1) {
    shuliang.setText(shuliang1);
}

}

布局


<android.support.v7.widget.RecyclerView
android:id="@+id/shangpinRecyclerView"
android:layout_width=“match_parent”
android:layout_weight=“9”
android:layout_height=“0dp”>

</android.support.v7.widget.RecyclerView>
<LinearLayout

    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    >
    <CheckBox
        android:paddingRight="20dp"
        android:layout_gravity="center"
        android:id="@+id/quanxuan"
        android:text="全选"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:layout_gravity="center"
        android:id="@+id/zongjia"
        android:text="总价为:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>
父 子
<CheckBox
    android:layout_gravity="center"
    android:id="@+id/zi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/ziSimpleDraweeView"
    android:layout_width="100dp"
    android:layout_height="100dp" />
<LinearLayout
    android:layout_width="wrap_content"
    android:orientation="vertical"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/ziname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/zijiage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <com.bwie.gwc.view.activity.JiaJianQi
        android:id="@+id/jiajianqi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </com.bwie.gwc.view.activity.JiaJianQi>

</LinearLayout>
主 package com.bwie.gwc.view.fragmenter;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
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.TextView;

import com.bwie.gwc.R;
import com.bwie.gwc.model.GouWuChBean;
import com.bwie.gwc.presenter.GouWuChePager;
import com.bwie.gwc.view.adapter.ShangPinAdapter;
import com.bwie.gwc.view.intenter.IManintenter;
import com.bwie.gwc.view.intenter.ZongJiaintenter;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;

/**

  • @Auther: zh

  • @Date: 2019/4/6 15:11

  • @Description: ?{赵光金}
    */
    public class Shou1Fragmenter extends Fragment implements IManintenter, ZongJiaintenter {
    @BindView(R.id.quanxuan)
    CheckBox quanxuan;
    @BindView(R.id.zongjia)
    TextView zongjia;
    @BindView(R.id.shangpinRecyclerView)
    RecyclerView shangpinRecyclerView;
    Unbinder unbinder;
    private ShangPinAdapter pinAdapter;
    private List<GouWuChBean.DataBean> data;
    //权限的数组
    private static String[] PERMISSIONS_STORAGE = {
    Manifest.permission.ACCESS_NETWORK_STATE,
    //读取内存权限
    Manifest.permission.READ_EXTERNAL_STORAGE,
    //写入内存权限
    Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    private static int REQUEST_PERMISSION_CODE = 1;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.shou1layout, container, false);
    unbinder = ButterKnife.bind(this, view);
    if (getUserVisibleHint()) {
    GouWuChePager gouWuChePager = new GouWuChePager(this);
    gouWuChePager.getgouwuchepresenter();
    LinearLayoutManager manager = new LinearLayoutManager(getActivity());
    manager.setOrientation(LinearLayoutManager.VERTICAL);
    shangpinRecyclerView.setLayoutManager(manager);
    pinAdapter = new ShangPinAdapter(getActivity(),this);
    shangpinRecyclerView.setAdapter(pinAdapter);
    getquanxian();
    }
    return view;
    }
    private void getquanxian() {
    if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP){
    if (ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
    ActivityCompat.requestPermissions(getActivity(),PERMISSIONS_STORAGE,REQUEST_PERMISSION_CODE);
    }
    }
    }
    @Override
    public void getintenter(GouWuChBean gouWuChBean) {
    data = gouWuChBean.getData();
    pinAdapter.setData(data);
    pinAdapter.setQuanxuan(quanxuan);
    }

    @Override
    public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
    }

    @OnClick(R.id.quanxuan)
    public void onViewClicked() {
    boolean checked = quanxuan.isChecked();
    for (int i = 0; i <data.size(); i++) {
    data.get(i).setClick(checked);
    List<GouWuChBean.DataBean.ListBean> list = data.get(i).getList();
    for (int j = 0; j <list.size() ; j++) {
    list.get(j).setClick(checked);
    }
    }
    getzongjia();
    pinAdapter.notifyDataSetChanged();
    }

    private void getzongjia(){
    double zong=0;
    for (int i = 0; i <data.size() ; i++) {
    List<GouWuChBean.DataBean.ListBean> list = data.get(i).getList();
    for (int j = 0; j <list.size() ; j++) {
    boolean click = list.get(j).isClick();
    if (click) {
    String num = list.get(j).getNum();
    String price = list.get(j).getPrice();
    int i1 = Integer.parseInt(num);
    double v = Double.parseDouble(price);
    zong += i1 * v;
    }
    }
    }
    zongjia.setText(“总价为:¥”+zong+"");
    }
    //
    @Override
    public void zong() {
    getzongjia();
    }
    }

父Adapter
public class ShangPinAdapter extends RecyclerView.Adapter<ShangPinAdapter.MMA> {
Context context;
LayoutInflater inflater;
private ZiAdapter adapter;

private ZongJiaintenter zongJiaintenter;

public ShangPinAdapter(Context contexts, ZongJiaintenter zongJiaintenters) {
    this.zongJiaintenter = zongJiaintenters;
    this.context = contexts;
    this.inflater = LayoutInflater.from(context);
}

private CheckBox quanxuan;

public void setQuanxuan(CheckBox quanxuan) {
    this.quanxuan = quanxuan;
}

@NonNull
@Override
public MMA onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = inflater.inflate(R.layout.gouwuchelayout, viewGroup, false);
    MMA mma = new MMA(view);
    return mma;
}

@Override
public void onBindViewHolder(@NonNull MMA mma, final int i) {
    String sellerName = data.get(i).getSellerName();
    mma.funame.setText(sellerName);
    boolean click = data.get(i).isClick();
    mma.fuclick.setChecked(click);
    LinearLayoutManager manager = new LinearLayoutManager(context);
    manager.setOrientation(LinearLayoutManager.VERTICAL);
    mma.ziRecyclerView.setLayoutManager(manager);
    adapter = new ZiAdapter(context,zongJiaintenter);
    adapter.setFuclick(mma.fuclick, data);
    adapter.setQuanxuan(quanxuan);
    mma.ziRecyclerView.setAdapter(adapter);
    final List<GouWuChBean.DataBean.ListBean> list = data.get(i).getList();
    adapter.setData(list);
    mma.fuclick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            CheckBox box = (CheckBox) v;
            boolean checked = box.isChecked();
            data.get(i).setClick(checked);
            for (int j = 0; j < list.size(); j++) {
                list.get(j).setClick(checked);
            }
            boolean quabxuanss = quabxuanss();
            quanxuan.setChecked(quabxuanss);
            zongJiaintenter.zong();
            notifyDataSetChanged();
        }
    });
}

private boolean quabxuanss() {
    for (int i = 0; i < data.size(); i++) {
        boolean click = data.get(i).isClick();
        if (!click) {
            return false;
        }
    }
    return true;
}

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

List<GouWuChBean.DataBean> data = new ArrayList<>();

public void setData(List<GouWuChBean.DataBean> datas) {
    this.data.clear();
    this.data.addAll(datas);
    notifyDataSetChanged();
}

public class MMA extends RecyclerView.ViewHolder {

    private final CheckBox fuclick;
    private final TextView funame;
    private final RecyclerView ziRecyclerView;

    public MMA(@NonNull View itemView) {
        super(itemView);
        fuclick = itemView.findViewById(R.id.fuclick);
        funame = itemView.findViewById(R.id.funame);
        ziRecyclerView = itemView.findViewById(R.id.ziRecyclerView);
    }
}

}
子Adapter
public class ZiAdapter extends RecyclerView.Adapter<ZiAdapter.BBA> {
Context context;
LayoutInflater inflater;
private ZongJiaintenter zongJiaintenter;

public ZiAdapter(Context context1, ZongJiaintenter zongJiaintenters) {
    this.zongJiaintenter = zongJiaintenters;
    this.context = context1;
    this.inflater = LayoutInflater.from(context);

}

private CheckBox quanxuan;

public void setQuanxuan(CheckBox quanxuan) {
    this.quanxuan = quanxuan;
}

private CheckBox fuclick;
private List<GouWuChBean.DataBean> listBeans;

public void setFuclick(CheckBox fuclick, List<GouWuChBean.DataBean> beanList) {
    this.listBeans = beanList;
    this.fuclick = fuclick;
}

@NonNull
@Override
public BBA onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = inflater.inflate(R.layout.zilayout, viewGroup, false);
    BBA bba = new BBA(view);
    return bba;
}

@Override
public void onBindViewHolder(@NonNull final BBA bba, final int i) {
    String price = list.get(i).getPrice();
    bba.zijiage.setText("¥" + price);
    String title = list.get(i).getTitle();
    bba.ziname.setText(title);
    Uri uri = Uri.parse(list.get(i).getImages());
    bba.ziimg.setImageURI(uri);
    boolean click = list.get(i).isClick();
    bba.ziclick.setChecked(click);
    String num = list.get(i).getNum();
    bba.jiajianqi.setShuliang(num);
    bba.jiajianqi.setJia(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String num = list.get(i).getNum();
            int i1 = Integer.parseInt(num);
            i1++;
            list.get(i).setNum(i1 + "");
            bba.jiajianqi.setShuliang(i1 + "");
            zongJiaintenter.zong();
            notifyDataSetChanged();
        }
    });
    bba.jiajianqi.setJian(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String num = list.get(i).getNum();
            int i1 = Integer.parseInt(num);
            i1--;
            if (i1 > 0) {

                list.get(i).setNum(i1 + "");
                bba.jiajianqi.setShuliang(i1 + "");
                zongJiaintenter.zong();
            }
            notifyDataSetChanged();
        }
    });
    bba.ziclick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            CheckBox box = (CheckBox) v;
            boolean checked = box.isChecked();
            list.get(i).setClick(checked);
            boolean fuclicks = fuclicks();
            fuclick.setChecked(fuclicks);
            boolean quanxuans = quanxuans();
            quanxuan.setChecked(quanxuans);
            zongJiaintenter.zong();
            notifyDataSetChanged();
        }


    });
}

private boolean quanxuans() {
    for (int i = 0; i < listBeans.size(); i++) {
        List<GouWuChBean.DataBean.ListBean> list = listBeans.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            boolean click = list.get(j).isClick();
            if (!click) {
                return false;
            }
        }
    }
    return true;
}

private boolean fuclicks() {
    for (int i = 0; i < list.size(); i++) {
        boolean click = list.get(i).isClick();
        if (!click) {
            return false;
        }
    }
    return true;
}

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

List<GouWuChBean.DataBean.ListBean> list = new ArrayList<>();

public void setData(List<GouWuChBean.DataBean.ListBean> lists) {
    this.list.clear();
    this.list.addAll(lists);
    notifyDataSetChanged();
}

public class BBA extends RecyclerView.ViewHolder {

    private final TextView zijiage;
    private final TextView ziname;
    private final SimpleDraweeView ziimg;
    private final CheckBox ziclick;
    private final JiaJianQi jiajianqi;

    public BBA(@NonNull View itemView) {
        super(itemView);
        zijiage = itemView.findViewById(R.id.zijiage);
        ziname = itemView.findViewById(R.id.ziname);
        ziimg = itemView.findViewById(R.id.ziSimpleDraweeView);
        ziclick = itemView.findViewById(R.id.zi);
        jiajianqi = itemView.findViewById(R.id.jiajianqi);
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值