HttpUtils+MVP的Android购物车

首先是依赖

compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.okhttp3:okhttp:3.3.0'
compile 'com.github.bumptech.glide:glide:3.7.0'

购物车的Main布局

<?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=".view.MainViewActivity">

   <ExpandableListView
       android:id="@+id/expan_able"
       android:layout_width="match_parent"
       android:groupIndicator="@null"
       android:layout_weight="1"
       android:layout_height="0dp">

   </ExpandableListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:layout_height="wrap_content">

        <CheckBox
            android:id="@+id/quan_cbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/total"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:text="合计:0"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/qu_total"
            android:background="#ff0000"
            android:text="去结算(0)"
            android:textStyle="bold"
            android:gravity="center"
            android:layout_width="100dp"
            android:layout_height="40dp" />
    </LinearLayout>
</LinearLayout>

二级列表的父布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="wrap_content">

    <CheckBox
        android:id="@+id/parent_box"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/parent_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

二级列表的子布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="wrap_content">

    <CheckBox
        android:id="@+id/child_box"
        android:layout_gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/child_img"
        android:layout_width="90dp"
        android:layout_height="90dp" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_gravity="center"
        android:layout_marginLeft="6dp"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/child_title"
            android:maxLines="1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/child_price"
                android:textColor="#ff0000"
                android:layout_marginTop="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <com.laowang.wby.view.custom.AddSubView
                android:id="@+id/addsub"
                android:layout_marginLeft="15dp"
                android:layout_width="110dp"
                android:layout_height="30dp">

            </com.laowang.wby.view.custom.AddSubView>
        </LinearLayout>

    </LinearLayout>

    <TextView
        android:id="@+id/child_delete"
        android:text="删除"
        android:gravity="center"
        android:layout_gravity="center"
        android:layout_marginRight="7dp"
        android:background="#ff0000"
        android:layout_width="50dp"
        android:layout_height="70dp" />
</LinearLayout>

自定义加减类的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:background="@drawable/add_shape"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/sub"
        android:text="-"
        android:gravity="center"
        android:background="@drawable/add_shape"
        android:layout_width="30dp"
        android:layout_height="30dp" />
    <EditText
        android:id="@+id/count"
        android:background="@null"
        android:layout_width="50dp"
        android:gravity="center"
        android:layout_height="30dp" />
    <TextView
        android:id="@+id/add"
        android:text="+"
        android:gravity="center"
        android:background="@drawable/add_shape"
        android:layout_width="30dp"
        android:layout_height="30dp" />
</LinearLayout>

//一个灰边shape
<?xml version="1.0" encoding="utf-8"?>
<shape
    android:shape="rectangle"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <size android:height="30dp" android:width="100dp"/>
    <stroke android:width="1dp" android:color="#999999"/>
</shape>

MVP用到的接口

//View接口
public interface IMainView {
    //显示数据
    void showShoppcart(List<ShoppBean.DataBean> data);
    //显示总价
    void showSum(double price);
    //获取总价的集合
    List<ShoppBean.DataBean> datap();
}

//Model接口
public interface IModel {

    //获取购物车数据
    void getShoppData(String surl, Map<String,String> map,ShoppListener shoppListener);
    //计算总价
    void ji_price(List<ShoppBean.DataBean> data,JiPriceListener jiPriceListener);
}

//Presenter接口
public interface IPresenter {

    void showShoppcarttoView(IModel iModel, IMainView iMainView);

    void showSumtoView(IModel iModel, IMainView iMainView);
}

//获取购物车数据的监听接口
public interface ShoppListener {
    void ShoppSuccess(String json);
    void ShoppError(String error);
}

//计算价格的监听接口
public interface JiPriceListener {
    void jiprice(double price);
}

M层获取数据

public class ShoppModel implements IModel {

    @Override
    public void getShoppData(String surl, Map<String, String> map, final ShoppListener shoppListener) {

        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        httpUtils.okPost(surl,map);
        httpUtils.setOkLoadListener(new HttpUtils.OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {
                shoppListener.ShoppSuccess(json);
            }

            @Override
            public void okLoadError(String error) {
                shoppListener.ShoppError(error);
            }
        });
    }
    //计算价格
    @Override
    public void ji_price(List<ShoppBean.DataBean> data, JiPriceListener jiPriceListener) {

        double sum = 0;

        for (int i = 0; i < data.size(); i++) {

            List<ShoppBean.DataBean.ListBean> list = data.get(i).getList();

            for (int j = 0; j < list.size(); j++) {

                boolean child_flag = list.get(j).isChild_flag();
                if (child_flag) {
                    double price = list.get(j).getPrice()*list.get(j).getNum();
                    sum += price;
                }

            }
        }

        jiPriceListener.jiprice(sum);
    }
}

P层一些逻辑运算

public class ShoppPresenter implements IPresenter {

    private static final String TAG = "ShoppPresenter+++";
    @Override
    public void showShoppcarttoView(IModel iModel, final IMainView iMainView) {

        Map<String, String> map = new HashMap<>();
        map.put("uid","10756");

        iModel.getShoppData(ApiUtil.Select_url, map, new ShoppListener() {
            @Override
            public void ShoppSuccess(String json) {

                ShoppBean shoppBean = new Gson().fromJson(json, ShoppBean.class);
                List<ShoppBean.DataBean> data = shoppBean.getData();

                iMainView.showShoppcart(data);

            }

            @Override
            public void ShoppError(String error) {
                Log.d(TAG,"error:"+error);
            }
        });

    }

    @Override
    public void showSumtoView(IModel iModel, final IMainView iMainView) {
        iModel.ji_price(iMainView.datap(), new JiPriceListener() {
            @Override
            public void jiprice(double price) {
                iMainView.showSum(price);
            }
        });
    }
}

V层展示数据

public class MainViewActivity extends AppCompatActivity implements View.OnClickListener, IMainView {

    private ExpandableListView expan_able;
    private CheckBox quan_cbox;
    private TextView total;
    private TextView qu_total;
    private ShoppPresenter shoppPresenter;
    private List<ShoppBean.DataBean> list_tem;
    private MyExAdapter myExAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initviews();
        initDatas();
    }

    private void initDatas() {

        shoppPresenter = new ShoppPresenter();
        shoppPresenter.showShoppcarttoView(new ShoppModel(), this);
    }

    public void initviews() {
        expan_able = findViewById(R.id.expan_able);
        quan_cbox = findViewById(R.id.quan_cbox);
        total = findViewById(R.id.total);
        qu_total = findViewById(R.id.qu_total);

        quan_cbox.setOnClickListener(this);
        qu_total.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //全选,计算总价
            case R.id.quan_cbox:
                boolean quan_checked = quan_cbox.isChecked();

                for (int i = 0; i < list_tem.size(); i++) {
                    list_tem.get(i).setParent_flag(quan_checked);
                    List<ShoppBean.DataBean.ListBean> list = list_tem.get(i).getList();

                    for (int j = 0; j < list.size(); j++) {
                        list.get(j).setChild_flag(quan_checked);
                    }
                }
                //刷新适配器
                myExAdapter.notifyDataSetChanged();
                //调用计算总价的方法
                ShoppPresenter shoppPresenter = new ShoppPresenter();
                shoppPresenter.showSumtoView(new ShoppModel(),this);
                break;

            case R.id.qu_total:
                Toast.makeText(MainViewActivity.this,"去计算总价",Toast.LENGTH_SHORT).show();
                break;
        }
    }

    //展示购物车数据
    @Override
    public void showShoppcart(final List<ShoppBean.DataBean> data) {
        list_tem = data;

        myExAdapter = new MyExAdapter(MainViewActivity.this, data, this);
        expan_able.setAdapter(myExAdapter);

        //展开ExpandableListView
        int count = expan_able.getCount();
        for (int i = 0; i < count; i++) {
            expan_able.expandGroup(i);
        }

    }

    //显示总价
    @Override
    public void showSum(double price) {
        total.setText("合计:" + price);
    }

    @Override
    public List<ShoppBean.DataBean> datap() {
        return list_tem;
    }

}

二级列表适配器

public class MyExAdapter extends BaseExpandableListAdapter {

    private Context context;
    private List<ShoppBean.DataBean> data;
    private IMainView iMainView;

    public MyExAdapter(Context context, List<ShoppBean.DataBean> data, IMainView iMainView) {
        this.context = context;
        this.data = data;
        this.iMainView = iMainView;
    }

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

    @Override
    public int getChildrenCount(int groupPosition) {
        return data.get(groupPosition).getList().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return data.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return data.get(groupPosition).getList().get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        final ParentViewHolder parentViewHolder;
        if (convertView == null){
            parentViewHolder = new ParentViewHolder();

            convertView = View.inflate(context, R.layout.item_parent,null);

            parentViewHolder.parent_box = convertView.findViewById(R.id.parent_box);
            parentViewHolder.parent_title = convertView.findViewById(R.id.parent_title);

            convertView.setTag(parentViewHolder);
        }else {
            parentViewHolder = (ParentViewHolder) convertView.getTag();
        }

        //赋值
        parentViewHolder.parent_title.setText(data.get(groupPosition).getSellerName());
        //父复选框赋状态值
        parentViewHolder.parent_box.setChecked(data.get(groupPosition).isParent_flag());
        //复选框的点击事件
        parentViewHolder.parent_box.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean isChecked = parentViewHolder.parent_box.isChecked();
                //给自己父复选框赋值
                data.get(groupPosition).setParent_flag(isChecked);
                //给子列表赋值
                List<ShoppBean.DataBean.ListBean> list = data.get(groupPosition).getList();

                for (int i = 0; i < list.size(); i++) {
                    ShoppBean.DataBean.ListBean listBean = list.get(i);
                    listBean.setChild_flag(isChecked);
                }

                notifyDataSetChanged();

                //调用计算的方法
                ShoppPresenter shoppPresenter = new ShoppPresenter();
                shoppPresenter.showSumtoView(new ShoppModel(),iMainView);


            }
        });
        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final ChildViewHolder childViewHolder;
        if (convertView == null){
            childViewHolder = new ChildViewHolder();

           convertView = View.inflate(context,R.layout.item_child,null);

            childViewHolder.child_box = convertView.findViewById(R.id.child_box);
            childViewHolder.child_img = convertView.findViewById(R.id.child_img);
            childViewHolder.child_title = convertView.findViewById(R.id.child_title);
            childViewHolder.child_price = convertView.findViewById(R.id.child_price);
            childViewHolder.child_delete = convertView.findViewById(R.id.child_delete);
            childViewHolder.addsub = convertView.findViewById(R.id.addsub);
            convertView.setTag(childViewHolder);
        }else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }

        //赋值
        final List<ShoppBean.DataBean.ListBean> list = data.get(groupPosition).getList();
        childViewHolder.child_title.setText(list.get(childPosition).getTitle());
        childViewHolder.child_price.setText(list.get(childPosition).getPrice()+"");
        //子复选框赋状态值
        childViewHolder.child_box.setChecked(list.get(childPosition).isChild_flag());

        String[] split = list.get(childPosition).getImages().split("\\|");
        Glide.with(context).load(split[0]).into(childViewHolder.child_img);


        childViewHolder.addsub.setCount(list.get(childPosition).getNum());
        childViewHolder.addsub.setOnAddClick(new AddSubView.OnAddSubClick() {
            @Override
            public void onAddSubClick() {
                String count = childViewHolder.addsub.getCount();
                list.get(childPosition).setNum(Integer.parseInt(count));
                notifyDataSetChanged();
                ShoppPresenter shoppPresenter = new ShoppPresenter();
                shoppPresenter.showSumtoView(new ShoppModel(),iMainView);
            }
        });
        //子条目复选框的点击事件
        childViewHolder.child_box.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取当前条目状态
                boolean child_checked = childViewHolder.child_box.isChecked();
                //设置当前子条目的状态
                list.get(childPosition).setChild_flag(child_checked);
                //for循环当前的状态
                boolean ch_flag = true;//一个开关标记
                for (int i = 0; i <list.size(); i++) {
                    boolean child_flag = list.get(i).isChild_flag();
                    if (child_flag == false){
                        ch_flag = false;
                    }
                }
                //将ch_flag赋值给父条目的复选框
                data.get(groupPosition).setParent_flag(ch_flag);

                notifyDataSetChanged();

                //调用计算的方法
                ShoppPresenter shoppPresenter = new ShoppPresenter();
                shoppPresenter.showSumtoView(new ShoppModel(),iMainView);
            }
        });

        //删除
        childViewHolder.child_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.remove(childPosition);
                data.remove(groupPosition);
                notifyDataSetChanged();
            }
        });
        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }


    static class ParentViewHolder{
        CheckBox parent_box;
        TextView parent_title;
    }

    static class ChildViewHolder{
        CheckBox child_box;
        ImageView child_img;
        TextView child_title;
        TextView child_price;
        TextView child_delete;
        AddSubView addsub;
    }


}

自定义加减类

public class AddSubView extends LinearLayout implements View.OnClickListener {

    private TextView add;
    private TextView sub;
    private EditText count;
    private OnAddSubClick onAddClick;

    public AddSubView(Context context) {
        this(context,null);
    }

    public AddSubView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public AddSubView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        View view = View.inflate(context, R.layout.add_layout, this);
        add = view.findViewById(R.id.add);
        sub = view.findViewById(R.id.sub);
        count = view.findViewById(R.id.count);

        add.setOnClickListener(this);
        sub.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.add:
                add();
                onAddClick.onAddSubClick();
                break;
            case R.id.sub:
                sub();
                onAddClick.onAddSubClick();
                break;
        }

    }

    //添加
    public void add(){
        String s = count.getText().toString();
        int i = Integer.parseInt(s);
        i++;
        count.setText(i+"");


    }

    //减少
    public void sub(){
        String s = count.getText().toString();
        int i = Integer.parseInt(s);
        if (i>=1){
            i--;
            count.setText(i+"");
        }
    }
    //设置数量
    public void setCount(int cousize){
        count.setText(cousize+"");
    }
    //获取数量
    public String getCount(){
       return count.getText().toString();
    }

    public interface OnAddSubClick{
      void onAddSubClick();
    }
    public void setOnAddClick(OnAddSubClick onAddClick){
        this.onAddClick = onAddClick;
    }
}

猜你喜欢

转载自blog.csdn.net/wrpbk/article/details/80186167
今日推荐