1. 程式人生 > >購物車二級列表

購物車二級列表

做開發,直接上效果,沒有效果都是扯淡
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
這裡用的二級列表(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;
    }
}