直接寫代碼
一。 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);
}
}