天天看點

Android購物車 (二)MVP(擷取資料 聯網 購物車主體)

直接寫代碼

一。 MainActivity中的代碼

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ExpandableListView;
import android.widget.TextView;

import com.example.adapter.CartAdapter2;
import com.example.bean.Goods;
import com.example.bean.Result;
import com.example.bean.Shop;
import com.example.core.DataCall;
import com.example.presenter.CartPresenter;

import java.util.ArrayList;
import java.util.List;

public class TowActivity extends AppCompatActivity implements  DataCall<List<Shop>>,CartAdapter2.TotalPriceListener {

    private TextView mSumPrice;
    private CheckBox mCheckAll;
    private ExpandableListView mGoodslist;
    private CartAdapter2 cartAdapter;
    private CartPresenter cartPresenter = new CartPresenter(this);
    private ExpandableListView mGoodsList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tow);
        mGoodsList = findViewById(R.id.list_cart);//多級清單
        mSumPrice = findViewById(R.id.goods_sum_price);//商品價格
        mCheckAll = findViewById(R.id.checkall);//全選按鈕
        //點選調用Adapter中的checkall方法  全選或全不選
        mCheckAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                cartAdapter.checkAll(isChecked);
            }
        });
        mGoodslist = findViewById(R.id.list_cart);
        cartAdapter = new CartAdapter2();//設定擴充卡
        mGoodslist.setAdapter(cartAdapter);
        cartAdapter.setTotalPriceListener(this);//設定總價回調器
        /*mGoodsList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                return true;
            }
        });*/
        cartPresenter.requestData();//到Presenter層中
    }

    @Override
    public void success(List<Shop> data) {
        cartAdapter.addAll(data);
        //周遊所有group 将所有項設定成預設
        int groupCount = data.size();
        for (int i = 0; i < groupCount; i++) {
            mGoodsList.expandGroup(i);
        }
        cartAdapter.notifyDataSetChanged();
    }

    @Override
    public void error(Result result) {

    }

    public void totalPrice(double totalPrice)
    {
        mSumPrice.setText(String.valueOf(totalPrice));//總價格
    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }
}
           

2。Presenter 層 (CartPresenter)

package com.example.presenter;

import android.os.AsyncTask;

import com.example.bean.CartModel;
import com.example.bean.Result;
import com.example.core.DataCall;

public class CartPresenter {

    private static DataCall dataCall;

    public CartPresenter(DataCall dataCall) {
        this.dataCall = dataCall;
    }

    public void CartPresenter() {
        this.dataCall = null;
    }
    public static void requestData() {
        new AsyncTaskCart().execute();
    }

    private static class AsyncTaskCart extends AsyncTask<String,Void,Result> {
        @Override
        protected Result doInBackground(String... strings) {
            Result cartData = CartModel.getCartData();
            return cartData;
        }

        @Override
        protected void onPostExecute(Result result) {
            super.onPostExecute(result);
            if (result.getCode() == 0)
            {
                dataCall.success(result.getData());
            }
            else {
                dataCall.error(result);
            }
        }
    }
}
           

3。Model層 (CartModel)

package com.example.bean;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;

public class CartModel {

    public static Result getCartData() {
            //HttpUtils httpUtils = new HttpUtils();
        String urldata = "接口";

        //String json = httpUtils.get();
            Gson gson = new Gson(); //直接解析
            Type type = new TypeToken<Result<List<Shop>>>(){}.getType();//如果用泛型 一定要寫
        Result result = gson.fromJson(urldata, type);
        return result;
    }
}
           

4。 Adapter 擴充卡(CartAdapter2.java)最重要的一部分 購物車邏輯

public class CartAdapter2 extends BaseExpandableListAdapter {

    private List<Shop> mList = new ArrayList<>();

    private TotalPriceListener totalPriceListener;

    public CartAdapter2() {

    }

    public void setTotalPriceListener(TotalPriceListener totalPriceListener) {
        this.totalPriceListener = totalPriceListener;
    }

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

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

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

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return mList.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 false;
    }

    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        GroupHolder groupHolder = null;

        if (convertView == null) {
            groupHolder = new GroupHolder();
            convertView = View.inflate(parent.getContext(), R.layout.cart_group_item, null);
            groupHolder.checkBox = convertView.findViewById(R.id.check_group);
            convertView.setTag(groupHolder);
        } else {
            groupHolder = (GroupHolder) convertView.getTag();
        }
        final Shop shop = mList.get(groupPosition);
        groupHolder.checkBox.setText(shop.getSellerName());
        groupHolder.checkBox.setChecked(shop.isCheck());//設定商鋪為選中狀态
        groupHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                shop.setCheck(isChecked);//資料更新
                List<Goods> goodsList = mList.get(groupPosition).getList();//得到商品資料
                for (int i = 0; i < goodsList.size(); i++) {
                    goodsList.get(i).setSelected(isChecked ? 1 : 0);//商鋪選中則商品必須選中
                }
                notifyDataSetChanged();
                //計算價格
                  calumniatePrice();

            }
        });
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        MyViewHolder myViewHolder = null;
        if (convertView == null) {
            convertView = View.inflate(parent.getContext(), R.layout.cart_item, null);
            myViewHolder = new MyViewHolder();
            myViewHolder.text = convertView.findViewById(R.id.text);
            myViewHolder.price = convertView.findViewById(R.id.text_price);
            myViewHolder.image = convertView.findViewById(R.id.image);
            myViewHolder.addSub = convertView.findViewById(R.id.add_sub_layout);
            myViewHolder.check = convertView.findViewById(R.id.cart_goods_check);
            convertView.setTag(myViewHolder);
        } else {
            myViewHolder = (MyViewHolder) convertView.getTag();
        }
        final Goods goods = mList.get(groupPosition).getList().get(childPosition);
        myViewHolder.text.setText(goods.getTitle());
        myViewHolder.price.setText("單價:" + goods.getPrice());//單價
        //點選選中 計算價格
        myViewHolder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                goods.setSelected(isChecked?1:0);
                calumniatePrice();//計算價格
            }
        });

        if (goods.getSelected() == 0)
        {
            myViewHolder.check.setChecked(false);
        }
        else {
            myViewHolder.check.setChecked(true);
        }
        //由于我們的資料圖檔提供的不标準,是以我們需要切割得到圖檔
        //将Https轉換成http
        String replace = goods.getImages().replace("https","http");
        //分割字元串
        String[] split = replace.split("!");
        //分割出來的是多張圖檔  下标為0就ok
        Glide.with(parent.getContext()).load(split[0]).into(myViewHolder.image);

        myViewHolder.addSub.setCount(goods.getNum());//設定商品數量
        myViewHolder.addSub.setAddSubListener(new AddSubLayout.AddSubListener() {
            @Override
            public void addSub(int count) {
                goods.setNum(count);
                calumniatePrice();//計算價格
            }
        });
        return convertView;
    }

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

    public void addAll(List<Shop> data1) {
        if (data1 != null) {
            mList.addAll(data1);
        }
    }

    //全部選中 或者取消
    public void checkAll(boolean isChecked) {
        for (int i = 0; i < mList.size(); i++) {//循環的商家
            Shop shop = mList.get(i);
            shop.setCheck(isChecked);
            for (int j = 0; j < shop.getList().size(); j++) {
                Goods goods = shop.getList().get(j);
                goods.setSelected(isChecked?1:0);
            }
        }
        notifyDataSetChanged();
        calumniatePrice();
    }


    class MyViewHolder {
        CheckBox check;
        TextView text;
        TextView price;
        ImageView image;
        AddSubLayout addSub;
    }

    class GroupHolder {
        CheckBox checkBox;
    }

    /*
    計算總價格
     */
    private void calumniatePrice() {
        double totalprice = 0;
        for (int i = 0; i < mList.size(); i++) {
            Shop shop = mList.get(i);
            for (int j = 0; j < shop.getList().size(); j++) {
                Goods goods = shop.getList().get(j);
              if (goods.getSelected() == 1)//如果選中
                {
                    totalprice = totalprice + goods.getNum() * goods.getPrice();
                }
            }
        }

        if (totalPriceListener != null)
        {
            totalPriceListener.totalPrice(totalprice);
        }
    }

    public interface TotalPriceListener{
        void totalPrice(double totalPrice);
    }

}
           

繼續閱讀