andriod——简单实现二级购物车

andriod——简单实现二级购物车andriod——简单实现二级购物车


compile 'com.squareup.picasso:picasso:2.5.1'


//ChildBean
public class ChildBean {
    private String title;
    private String price;
    private String path;
    private Boolean isSelected=false;
    private int num;

    public ChildBean() {
    }

    public ChildBean(String title, String price, String path, Boolean isSelected, int num) {
        this.title = title;
        this.price = price;
        this.path = path;
        this.isSelected = isSelected;
        this.num = num;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public Boolean getSelected() {
        return isSelected;
    }

    public void setSelected(Boolean selected) {
        isSelected = selected;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}



/bean-GroupBean
public class GroupBean {
    public String group_name;
    public Boolean isSelected=false;

    public GroupBean() {
    }

    public GroupBean(String group_name, Boolean isSelected) {
        this.group_name = group_name;
        this.isSelected = isSelected;
    }

    public String getGroup_name() {
        return group_name;
    }

    public void setGroup_name(String group_name) {
        this.group_name = group_name;
    }

    public Boolean getSelected() {
        return isSelected;
    }

    public void setSelected(Boolean selected) {
        isSelected = selected;
    }
}

//utils-CartUtils
//CartUtils
public class CartUtils {

    private static ElvAdapter adapter;

    public static void setCartData(Context context, final List<GroupBean> flist, final List<List<ChildBean>> slist, ExpandableListView elv, final CheckBox all, final TextView all_count, final TextView all_money){
        all_count.setBackgroundResource(R.color.count);
        all_money.setBackgroundResource(R.color.money);
        all_count.setTextColor(Color.WHITE);
        all_money.setTextColor(Color.WHITE);
        elv.setGroupIndicator(null);
        adapter = new ElvAdapter(flist,slist,context,all,all_count,all_money);
        elv.setAdapter(adapter);
        for (int i=0;i<flist.size();i++){
            elv.expandGroup(i);
        }
        all.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i=0;i<flist.size();i++){
                    flist.get(i).setSelected(all.isChecked());
                    for (int j=0;j<slist.get(i).size();j++){
                        slist.get(i).get(j).setSelected(all.isChecked());
                    }
                }
                adapter.notifyDataSetChanged();
                checkNum(flist,slist,all_count,all_money);
            }
        });
    }

    public static void checkNum(List<GroupBean> flist, List<List<ChildBean>> slist, TextView count, TextView money){
        int all_count=0;
        int all_money = 0;
        for (int i=0;i<flist.size();i++){
            for (int j=0;j<slist.get(i).size();j++) {
                if(slist.get(i).get(j).getSelected()){
                    all_count += slist.get(i).get(j).getNum();
                    int v = (int) (Double.parseDouble(slist.get(i).get(j).getPrice())*slist.get(i).get(j).getNum());
                    all_money += v;
                }
            }
        }
        count.setText("总计:"+all_count);
        money.setText("计算:"+all_money);


    }

    static class ElvAdapter extends BaseExpandableListAdapter{
        List<GroupBean> flist;
        List<List<ChildBean>> slist;
        Context context;
        CheckBox all;
        TextView all_count;
        TextView all_money;

        public ElvAdapter(List<GroupBean> flist, List<List<ChildBean>> slist,Context context,CheckBox all,TextView all_count,TextView all_money) {
            this.flist = flist;
            this.slist = slist;
            this.context=context;
            this.all=all;
            this.all_count=all_count;
            this.all_money=all_money;
        }

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

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

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

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return slist.get(groupPosition).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) {
            View view=null;
            GroupHolder holder=null;
            if(convertView==null){
                convertView=View.inflate(context, R.layout.group,null);
                view=convertView;
                holder=new GroupHolder();
                holder.group=(CheckBox)view.findViewById(R.id.group);
                holder.group_name=(TextView) view.findViewById(R.id.group_name);
                convertView.setTag(holder);
            }else{
                view=convertView;
                holder= (GroupHolder) convertView.getTag();
            }
            holder.group_name.setText(flist.get(groupPosition).getGroup_name());
            holder.group.setChecked(flist.get(groupPosition).getSelected());
            holder.group.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(flist.get(groupPosition).getSelected()){
                        flist.get(groupPosition).setSelected(false);
                        all.setChecked(false);
                        for (int i=0;i<slist.get(groupPosition).size();i++){
                            slist.get(groupPosition).get(i).setSelected(false);
                        }
                    }else{
                        int count=0;
                        flist.get(groupPosition).setSelected(true);
                        for (int i=0;i<slist.get(groupPosition).size();i++){
                            slist.get(groupPosition).get(i).setSelected(true);
                        }
                        for (int i=0;i<flist.size();i++){
                            if(flist.get(i).getSelected()){
                                count++;
                            }
                        }
                        if(count==flist.size()){
                            all.setChecked(true);
                        }
                    }
                    checkNum(flist,slist,all_count,all_money);
                    notifyDataSetChanged();
                }
            });
            return view;
        }
        class GroupHolder{
            CheckBox group;
            TextView group_name;
        }
        class ChildHolder{
            CheckBox child;
            TextView title;
            ImageView image;
            TextView price;
            Jiajianqi amount_view;
        }

        @Override
        public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            View view=null;
            ChildHolder holder=null;
            if(convertView==null){
                convertView=View.inflate(context,R.layout.child,null);
                view=convertView;
                holder=new ChildHolder();
                holder.child=(CheckBox)view.findViewById(R.id.child);
                holder.title=(TextView) view.findViewById(R.id.title);
                holder.price=(TextView)view.findViewById(R.id.price);
                holder.image=(ImageView)view.findViewById(R.id.image);
                holder.amount_view=(Jiajianqi)view.findViewById(R.id.amount_view);
                convertView.setTag(holder);
            }else{
                view=convertView;
                holder= (ChildHolder) convertView.getTag();
            }
            Picasso.with(context).load(slist.get(groupPosition).get(childPosition).getPath()).into(holder.image);
            holder.title.setText(slist.get(groupPosition).get(childPosition).getTitle());
            holder.price.setText(""+slist.get(groupPosition).get(childPosition).getPrice());
            holder.child.setChecked(slist.get(groupPosition).get(childPosition).getSelected());
            final ChildHolder finalHolder = holder;
            holder.amount_view.setGoods_storage(100);
            holder.amount_view.setAmount(slist.get(groupPosition).get(childPosition).getNum());
            holder.amount_view.setOnAmountChangeListener(new Jiajianqi.OnAmountChangeListener() {
                @Override
                public void onAmountChange(View view, int amount) {
                    slist.get(groupPosition).get(childPosition).setNum(amount);
                    checkNum(flist,slist,all_count,all_money);
                }
            });
            holder.child.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(slist.get(groupPosition).get(childPosition).getSelected()){
                       slist.get(groupPosition).get(childPosition).setSelected(false);
                        flist.get(groupPosition).setSelected(false);
                        all.setChecked(false);
                    }else{
                        int fcount=0;
                        int scount=0;
                        slist.get(groupPosition).get(childPosition).setSelected(true);
                        for (int i=0;i<slist.get(groupPosition).size();i++){
                            if(slist.get(groupPosition).get(i).getSelected()){
                                scount++;
                            }
                        }
                        if(scount==slist.get(groupPosition).size()){
                            flist.get(groupPosition).setSelected(true);
                        }
                        for (int i=0;i<flist.size();i++){
                            if(flist.get(i).getSelected()){
                                fcount++;
                            }
                        }
                        if(fcount==flist.size()){
                            all.setChecked(true);
                        }

                    }
                    checkNum(flist,slist,all_count,all_money);
                    notifyDataSetChanged();
                }
            });
            return view;
        }

        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }
}
//Jiajianqi
public class Jiajianqi extends LinearLayout implements View.OnClickListener, TextWatcher {

    private static final String TAG = "AmountView";
    private int amount = 1; //购买数量
    private int goods_storage = 1; //商品库存

    private OnAmountChangeListener mListener;

    private EditText etAmount;
    private Button btnDecrease;
    private Button btnIncrease;

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

    public Jiajianqi(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater.from(context).inflate(R.layout.view_amount, this);
        etAmount = (EditText) findViewById(R.id.etAmount);
        btnDecrease = (Button) findViewById(R.id.btnDecrease);
        btnIncrease = (Button) findViewById(R.id.btnIncrease);
        btnDecrease.setOnClickListener(this);
        btnIncrease.setOnClickListener(this);
        etAmount.addTextChangedListener(this);

        TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(attrs, R.styleable.AmountView);
        int btnWidth = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_btnWidth, LayoutParams.WRAP_CONTENT);
        int tvWidth = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_tvWidth, 80);
        int tvTextSize = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_tvTextSize, 0);
        int btnTextSize = obtainStyledAttributes.getDimensionPixelSize(R.styleable.AmountView_btnTextSize, 0);
        obtainStyledAttributes.recycle();

        LayoutParams btnParams = new LayoutParams(btnWidth, LayoutParams.MATCH_PARENT);
        btnDecrease.setLayoutParams(btnParams);
        btnIncrease.setLayoutParams(btnParams);
        if (btnTextSize != 0) {
            btnDecrease.setTextSize(TypedValue.COMPLEX_UNIT_PX, btnTextSize);
            btnIncrease.setTextSize(TypedValue.COMPLEX_UNIT_PX, btnTextSize);
        }

        LayoutParams textParams = new LayoutParams(tvWidth, LayoutParams.MATCH_PARENT);
        etAmount.setLayoutParams(textParams);
        if (tvTextSize != 0) {
            etAmount.setTextSize(tvTextSize);
        }
    }

    public void setOnAmountChangeListener(OnAmountChangeListener onAmountChangeListener) {
        this.mListener = onAmountChangeListener;
    }

    public void setGoods_storage(int goods_storage) {
        this.goods_storage = goods_storage;
    }

    @Override
    public void onClick(View v) {
        int i = v.getId();
        if (i == R.id.btnDecrease) {
            if (amount > 1) {
                amount--;
                etAmount.setText(amount + "");
            }
        } else if (i == R.id.btnIncrease) {
            if (amount < goods_storage) {
                amount++;
                etAmount.setText(amount + "");
            }
        }

        etAmount.clearFocus();

        if (mListener != null) {
            mListener.onAmountChange(this, amount);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    public int getAmount(){
        return amount;
    }

    public void setAmount(int amount){
        this.amount = amount;
        etAmount.setText(amount+"");
    }

    public interface OnAmountChangeListener {
        void onAmountChange(View view, int amount);
    }

}


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

import com.example.thecar.bean.ChildBean;
import com.example.thecar.bean.GroupBean;
import com.example.thecar.utils.CartUtils;

import java.util.ArrayList;
import java.util.List;
///////////////MainActivity
public class MainActivity extends AppCompatActivity {
    private ExpandableListView listView;
    private TextView price,num;
    private CheckBox both;
    private List<GroupBean> glist=new ArrayList<>();
    private List<List<ChildBean>> clists=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView= (ExpandableListView) findViewById(R.id.listview);
        price= (TextView) findViewById(R.id.price);
        num= (TextView) findViewById(R.id.num);
        both= (CheckBox) findViewById(R.id.both);
        for(int i=0;i<2;i++){
            glist.add(new GroupBean("商家"+i,false));

        }
        List<ChildBean> list1=new ArrayList<>();
        for(int i=0;i<5;i++){
            list1.add(new ChildBean("商品"+i,1+"","https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=594559231,2167829292&fm=27&gp=0.jpg",false,2));
        }
        List<ChildBean> list2=new ArrayList<>();
        for(int i=0;i<5;i++){
            list2.add(new ChildBean("商品"+i,1+"","https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=594559231,2167829292&fm=27&gp=0.jpg",false,2));
        }
        clists.add(list1);
        clists.add(list2);
        CartUtils.setCartData(this,glist,clists,listView,both,num,price);

    }
}





//bg_amount_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF" />
    <stroke
        android:width="1dp"
        android:color="@color/divider" />
    <padding
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp" />
</shape>


//btn_amount.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/divider" />
    <item android:state_enabled="false" android:drawable="@color/divider" />
    <item android:drawable="@android:color/white" />
</selector>


//divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="0.5dp"/>
    <solid android:color="@color/divider"/>
</shape>

//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">


    <ExpandableListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"></ExpandableListView>
    <RelativeLayout
        android:id="@+id/a"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        >
        <CheckBox
            android:id="@+id/both"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="全选"
            android:layout_centerVertical="true"
            />
        <TextView
            android:id="@+id/price"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="价格"
            android:layout_centerInParent="true"
            android:gravity="center"
            />
        <TextView
            android:id="@+id/num"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="价格"
            android:layout_alignParentRight="true"
            android:gravity="center"
            />
    </RelativeLayout>
</RelativeLayout>

//child.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:gravity="center_vertical"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp">
    <CheckBox
        android:id="@+id/child"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="30dp"
        />
     <ImageView
         android:id="@+id/image"
         android:layout_width="100dp"
         android:layout_height="100dp"
         android:scaleType="centerCrop"
         />
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical"
        android:layout_marginLeft="10dp"
        >
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:layout_marginRight="10dp"
            android:maxLines="2"
            android:textSize="16sp"
            android:layout_marginTop="10dp"
            />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            >
            <TextView
                android:id="@+id/price"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:textSize="17sp"
                android:gravity="center_vertical"
                android:textColor="#ff8100"
                />
            <com.example.thecar.utils.Jiajianqi
                android:id="@+id/amount_view"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                app:btnTextSize="14sp"
                android:gravity="center"
                app:btnWidth="36dp"
                android:layout_marginBottom="5dp"
                app:tvWidth="50dp"></com.example.thecar.utils.Jiajianqi>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>


//group.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center_vertical"
    >
    <CheckBox
        android:id="@+id/group"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        />
    <TextView
        android:id="@+id/group_name"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:textSize="18sp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        />

</LinearLayout>

//view_amount.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:divider="@drawable/divider"
    android:background="@drawable/bg_amount_layout"
    android:showDividers="middle"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btnDecrease"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:background="@drawable/btn_amount"
        android:text="-"/>

    <EditText
        android:id="@+id/etAmount"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:minWidth="60dp"
        android:layout_weight="2"
        android:background="@null"
        android:inputType="number"
        android:gravity="center"
        android:text="1"/>

    <Button
        android:id="@+id/btnIncrease"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:background="@drawable/btn_amount"
        android:text="+"/>
</LinearLayout>


//attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="AmountView">
        <!-- 左右2+-按钮的宽度 -->
        <attr name="btnWidth" format="dimension" />
        <!-- 中间TextView的宽度 -->
        <attr name="tvWidth" format="dimension" />
        <!--<attr name="tvColor" format="color"/>-->
        <attr name="tvTextSize" format="dimension"/>
        <attr name="btnTextSize" format="dimension"/>
    </declare-styleable>
</resources>

//colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="divider">#ffd2d2d2</color>
    <color name="count">#ffae01</color>
    <color name="money">#ff6e01</color>
</resources>

//styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->

    </style>

</resources>