首先是依赖
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用到的接口
public interface IMainView {
void showShoppcart(List<ShoppBean.DataBean> data);
void showSum(double price);
List<ShoppBean.DataBean> datap();
}
public interface IModel {
void getShoppData(String surl, Map<String,String> map,ShoppListener shoppListener);
void ji_price(List<ShoppBean.DataBean> data,JiPriceListener jiPriceListener);
}
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);
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);
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;
}
}
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;
}
}