购物车二级列表

做开发,直接上效果,没有效果都是扯淡
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里用的二级列表(ExpandableListView)用的数据是一个json解析后的数据在bean 里面设置两个boolean 类型的数据来改变是否选中

这里用的是MVP 框架实现的购物车
这里实现的功能有:child 与group 的联动,互相监听,全选与child.group 的互动 加减控件的监听,实现选择后实时改变商品总价,与商品总数量。
直接上代码

github地址:https://github.com/victorlj/Shopping-Cart

MyAdapter

package com.example.mvp_gwc.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.mvp_gwc.R;
import com.example.mvp_gwc.bean.MyBean;
import com.example.mvp_gwc.weight.jiajianView;

import java.util.List;

public class MyAdapter extends BaseExpandableListAdapter {

    private List<MyBean.DataBean> list;
    private Context context;

    public MyAdapter(List<MyBean.DataBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

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

    @Override
    public int getChildrenCount(int groupPosition) {
        return list.get(groupPosition).getSpus().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }


    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }
    @Override
    public boolean hasStableIds() {
        return false;
    }



    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        groupHolder groupHolder;
        if(convertView ==null){
            convertView =View.inflate(context, R.layout.expenr_group,null);
            groupHolder = new groupHolder();
            groupHolder.group_ck=convertView.findViewById(R.id.group_ck);
            groupHolder.group_title=convertView.findViewById(R.id.group_title);
            convertView.setTag(groupHolder);
        }else{
            groupHolder = (MyAdapter.groupHolder) convertView.getTag();
        }
        groupHolder.group_ck.setChecked(list.get(groupPosition).isGroupischeck());
        groupHolder.group_title.setText(list.get(groupPosition).getName());
//        group 中group_ck的点击事件
        groupHolder.group_ck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (adaptercallback!=null){
                    adaptercallback.groupchecked(groupPosition);
                }
            }
        });

        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        childHolder childHolder;
        if(convertView ==null){
            convertView =View.inflate(context, R.layout.expenr_child,null);
            childHolder = new childHolder();
            childHolder.child_ck=convertView.findViewById(R.id.child_ck);
            childHolder.child_title=convertView.findViewById(R.id.child_title);
            childHolder.child_img=convertView.findViewById(R.id.child_img);
            childHolder.child_price=convertView.findViewById(R.id.child_price);
            childHolder.jiajianView =convertView.findViewById(R.id.jiajian);
            convertView.setTag(childHolder);
        }else{
            childHolder = (MyAdapter.childHolder) convertView.getTag();
        }
        childHolder.child_ck.setChecked(list.get(groupPosition).getSpus().get(childPosition).isChildischeck());
        childHolder.child_title.setText(list.get(groupPosition).getSpus().get(childPosition).getName());
        childHolder.child_price.setText(list.get(groupPosition).getSpus().get(childPosition).getSkus().get(0).getPrice()+"");
        Glide.with(convertView).load(list.get(groupPosition).getSpus().get(childPosition).getPic_url()).into(childHolder.child_img);
        childHolder.jiajianView.setNum(list.get(groupPosition).getSpus().get(childPosition).getPraise_num());
//        childHolder 中child.ck 的点击事件
        childHolder.child_ck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(adaptercallback!=null){
                    adaptercallback.childchecked(groupPosition,childPosition);
                }
            }
        });
//        childHolder中jiajianView 的监听事件
        childHolder.jiajianView.setjiajian(new jiajianView.jiajiancallback() {
            @Override
            public void setjiajian(int mnum) {
                list.get(groupPosition).getSpus().get(childPosition).setPraise_num(mnum);
                if(adaptercallback!=null){
                    adaptercallback.jiajian();
                }
            }
        });

        return convertView;
    }

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

    class groupHolder{
        CheckBox group_ck;
        TextView group_title;
    }

    class childHolder{
        CheckBox child_ck;
        TextView child_title;
        TextView child_price;
        ImageView child_img;
        jiajianView jiajianView;
    }
//    查看group 中所有child的状态
    public boolean lookgroupchecked(int groupposition){
        for (int i = 0; i <list.get(groupposition).getSpus().size(); i++) {
            if(!list.get(groupposition).getSpus().get(i).isChildischeck()){
                return false;
            }
        }
        return true;
    }
//    根据查看group 的状态然后改变child 的状态和group 的状态
    public void groupallchecked(int groupposition,boolean b){
        list.get(groupposition).setGroupischeck(b);
        for (int i = 0; i <list.get(groupposition).getSpus().size(); i++) {
            list.get(groupposition).getSpus().get(i).setChildischeck(b);
        }
    }
//    查看child 的状态
    public boolean lookchildchecked(int groupposition,int childposition){
        boolean b = list.get(groupposition).getSpus().get(childposition).isChildischeck();
        return b;
    }
//    改变child 的状态 然后 查看group 的状态最后改变group 的状态,
    public void childckecked(int groupposition,int childposition,boolean b){
        list.get(groupposition).getSpus().get(childposition).setChildischeck(b);
        boolean b1 = lookgroupchecked(groupposition);
        if(b1){
            list.get(groupposition).setGroupischeck(b1);
        }else{
            list.get(groupposition).setGroupischeck(b1);
        }
    }
//    查看是否全部选中
    public boolean lookallchecked(){
        for (int i = 0; i <list.size(); i++) {
            if(!lookgroupchecked(i)){
                return false;
            }
        }
        return true;
    }
//    改变全选与全不选
    public void setallchecked(boolean b){
        for (int i = 0; i <list.size(); i++) {
            groupallchecked(i,b);
        }
    }

    @Override
    public boolean areAllItemsEnabled() {
        return super.areAllItemsEnabled();
    }

//    自定义接口 
    public interface Adaptercallback{
//        group 的监听事件
        void groupchecked(int groupposition);
//        child的监听事件
        void childchecked(int groupposition,int childposition);
//        加减的监听事件
        void jiajian();
    }

    private Adaptercallback adaptercallback;

    public void setcallback(Adaptercallback adaptercallback){
        this.adaptercallback =adaptercallback;
    }

}

MainActivity

package com.example.mvp_gwc;

import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.mvp_gwc.adapter.MyAdapter;
import com.example.mvp_gwc.base.BaseActivity;
import com.example.mvp_gwc.bean.MyBean;
import com.example.mvp_gwc.ivew.IVew;
import com.example.mvp_gwc.pressent.PressentImpl;

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

public class MainActivity extends BaseActivity implements IVew {

    private CheckBox main_ck_qx;
    private TextView allprice;
    private TextView allnum;
    private ExpandableListView expend;
    private PressentImpl pressent;
    private List<MyBean.DataBean> list = new ArrayList<>();
    private String murl = "http://www.wanandroid.com/tools/mockapi/6523/restaurant-list";
    private MyAdapter adapter;

    @Override
    protected int getLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void getfindbyid() {
        main_ck_qx = findViewById(R.id.main_ck_qx);
        allprice = findViewById(R.id.allprice);
        allnum = findViewById(R.id.allnum);
        expend = findViewById(R.id.expend);
        adapter = new MyAdapter(list, this);
        expend.setAdapter(adapter);

        expend.setGroupIndicator(null);
        adapter.setcallback(new MyAdapter.Adaptercallback() {
            @Override
            public void groupchecked(int groupposition) {
                boolean b = adapter.lookgroupchecked(groupposition);
                adapter.groupallchecked(groupposition, !b);
                boolean b1 = adapter.lookallchecked();
                if (b1) {
                    main_ck_qx.setChecked(b1);
                } else {
                    main_ck_qx.setChecked(b1);
                }
                getallprice();
                getallnumber();
                adapter.notifyDataSetChanged();
            }

            @Override
            public void childchecked(int groupposition, int childposition) {
                boolean b = adapter.lookchildchecked(groupposition, childposition);
                adapter.childckecked(groupposition, childposition, !b);
                boolean b1 = adapter.lookallchecked();
                if (b1) {
                    main_ck_qx.setChecked(b1);
                } else {
                    main_ck_qx.setChecked(b1);
                }
                getallprice();
                getallnumber();
                adapter.notifyDataSetChanged();
            }

            @Override
            public void jiajian() {
                getallprice();
                getallnumber();
            }
        });
    }

    @Override
    protected void setonclicked() {
        main_ck_qx.setOnClickListener(this);
    }

    @Override
    protected void prasce() {
        pressent = new PressentImpl(this);
        pressent.getdata(murl);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.main_ck_qx:
                boolean b = adapter.lookallchecked();
                main_ck_qx.setChecked(!b);
                adapter.setallchecked(!b);
                getallprice();
                getallnumber();
                adapter.notifyDataSetChanged();
                break;
        }
    }

    @Override
    public void success(Object success) {
        list.addAll((Collection<? extends MyBean.DataBean>) success);
        getallprice();
        getallnumber();
        adapter.notifyDataSetChanged();
        //        第一次加载就展开所有的子类
        for (int i = 0; i <list.size(); i++) {
            expend.expandGroup(i);
        }
//        不能点击收缩
        expend.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                return true;
            }
        });
    }

    @Override
    public void error(String error) {
        Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
    }

    public void getallprice() {
        double number = 0.0;
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.get(i).getSpus().size(); j++) {
                if (list.get(i).getSpus().get(j).isChildischeck()) {
                    number += list.get(i).getSpus().get(j).getPraise_num() * list.get(i).getSpus().get(j).getSkus().get(0).getPrice();
                }
            }
        }
        allprice.setText("商品总价:" + number + "");
    }

    public void getallnumber() {
        int number = 0;
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.get(i).getSpus().size(); j++) {
                if (list.get(i).getSpus().get(j).isChildischeck()) {
                    number += list.get(i).getSpus().get(j).getPraise_num();
                }
            }
        }
        allnum.setText("商品总数量:" + number + "");
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/lin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <CheckBox
            android:id="@+id/main_ck_qx"
            android:text="全选"
            android:focusable="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/allprice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:text="商品总价:" />

        <TextView
            android:id="@+id/allnum"
            android:text="商品总数量:"
            android:gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <ExpandableListView
        android:id="@+id/expend"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/lin"></ExpandableListView>

</RelativeLayout>

自定义控件jiajianView

package com.example.mvp_gwc.weight;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.mvp_gwc.R;


public class jiajianView extends LinearLayout implements View.OnClickListener {
    private TextView jian;
    private TextView ed;
    private TextView jia;
    private int mnum;

    public jiajianView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LinearLayout.inflate(context, R.layout.add_jian, this);
        init();
    }

    public void setNum(int num){
       this.mnum =num;
       ed.setText(num+"");
    }

    private void init() {
        jian =findViewById(R.id.jian);
        jia =findViewById(R.id.jia);
        jia.setOnClickListener(this);
        jian.setOnClickListener(this);
        ed =findViewById(R.id.ed);
    }
    private jiajiancallback jiajiancallback;

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.jia:
                mnum++;
                ed.setText(mnum+"");
                if(jiajiancallback!=null){
                    jiajiancallback.setjiajian(mnum);
                }
                break;
            case R.id.jian:
                if(mnum>0){
                    mnum--;
                    ed.setText(mnum+"");
                    if(jiajiancallback!=null){
                        jiajiancallback.setjiajian(mnum);
                    }
                }else{
                    Toast.makeText(getContext(), "最小为0", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    public interface jiajiancallback{
        void setjiajian(int mnum);
    }

    public void setjiajian(jiajiancallback jiajiancallback){
        this.jiajiancallback =jiajiancallback;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43564787/article/details/85076315