自定义加减器
/**
* date:2018/11/20
* author:QMY(QMY)
* function:
*/
public class AddRemoveView extends LinearLayout implements View.OnClickListener{
TextView add_tv,sub_tv,product_number;
int number=1;
public AddRemoveView(Context context) {
this(context,null);
}
public AddRemoveView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AddRemoveView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//加载布局
View view = View.inflate(context, R.layout.add_remove, this);
//初始化控件
initView();
}
private void initView() {
add_tv = findViewById(R.id.add);
sub_tv = findViewById(R.id.sub);
product_number = findViewById(R.id.product_number);
add_tv.setOnClickListener(this);
sub_tv.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.add:
number++;
product_number.setText(number+"");
//回调
mNumber.Numbers(number);
break;
case R.id.sub:
if (number>1){
number--;
product_number.setText(number+"");
//回调
mNumber.Numbers(number);
}
break;
}
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
product_number.setText(number+"");
}
//接口
public interface Number{
void Numbers(int number);
}
public Number mNumber;
public void NumberChanged(Number number){
mNumber = number;
}
}
add_remove布局(加减器)
<LinearLayout
android:gravity="center_vertical"
android:background="#99000000"
android:layout_gravity="center_vertical"
android:layout_height="40dp"
android:layout_width="100dp"
android:layout_marginLeft="10dp"
android:padding="2dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/sub"
android:gravity="center"
android:background="#ffffff"
android:layout_height="match_parent"
android:layout_width="0dp"
android:textSize="16sp"
android:text="-"
android:layout_weight="1"/>
<TextView
android:id="@+id/product_number"
android:gravity="center"
android:background="#ffffff"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:text="1"
android:layout_weight="1"/>
<TextView android:id="@+id/add"
android:gravity="center"
android:background="#ffffff"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:textSize="16sp"
android:text="+"
android:layout_weight="1"/>
</LinearLayout>
购物车界面 mainactivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener, IphonePresenter.IphoneData, Madapter.ShopCart {
private ExpandableListView expandlistview;
private CheckBox allcheck;
private TextView allprice;
private Button pay;
Madapter madapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//适配器
madapter = new Madapter(MainActivity.this);
expandlistview.setAdapter(madapter);
//数据 p层
IphonePresenter iphonePresenter = new IphonePresenter(this);
iphonePresenter.requestData();
//接口
madapter.setShopCart(this);
}
private void initView() {
expandlistview = findViewById(R.id.expandlistview);
allcheck = findViewById(R.id.allcheck);
allprice = findViewById(R.id.allprice);
pay = findViewById(R.id.pay);
pay.setOnClickListener(this);
allcheck.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.pay:
break;
case R.id.allcheck: //全选按钮
//判断是否所有商品全被选中
boolean allSeled = madapter.isAllSeled();
//点击全选
madapter.onAllChecked(!allSeled);
madapter.notifyDataSetChanged();
refreshAll();
break;
}
}
@Override
public void datasuccess(List<Iphone.DataBean> dataBeans) {
madapter.setData(dataBeans);
//展开列表
for (int i=0;i<dataBeans.size();i++){
expandlistview.expandGroup(i);
}
}
//刷新checkbox状态和总价和总数量
private void refreshAll() {
//去判断是否所有得商品都被选中
boolean allSeled = madapter.isAllSeled();
//设置给全选checkBox
allcheck.setChecked(allSeled);
//计算总价
float totalPrice = madapter.totalPrice();
allprice.setText("总价:"+totalPrice);
//计算总数量
int producttotalNumber = madapter.ProducttotalNumber();
pay.setText("去结算("+producttotalNumber+")");
}
// /点击组条目的复选框时
@Override
public void selectGroup(int groupPosition) {
//首先判断子元素是否全被选中
boolean sellerChildItemSeled = madapter.isSellerChildItemSeled(groupPosition);
//商家被点击时 (全选或全不选)
madapter.SellerSeled(groupPosition,!sellerChildItemSeled);
//更新
madapter.notifyDataSetChanged();
refreshAll();
}
//点击子条目的checkbox
@Override
public void secectChild(int groupPosition, int childPosition) {
madapter.childSeled(groupPosition,childPosition);
madapter.notifyDataSetChanged();
refreshAll();
}
//点击加减器时
@Override
public void numberchanged(int groupPosition, int childPosition, int number) {
madapter.NumberChanged(groupPosition,childPosition,number);
madapter.notifyDataSetChanged();
refreshAll();
}
}
p层
/**
* date:2018/11/20
* author:QMY(QMY)
* function:
*/
public class IphonePresenter {
public void requestData(){
String path = "http://www.zhaoapi.cn/product/getCarts?uid=71";
//获取数据
OkHttpUtils.getInstance().doGet(path, new OkHttpUtils.Utils() {
@Override
public void failed() {
}
@Override
public void success(String string) {
//解析
Iphone iphone = new Gson().fromJson(string, Iphone.class);
mIphoneData.datasuccess(iphone.getData());
}
});
}
//接口
public interface IphoneData{
void datasuccess(List<Iphone.DataBean> dataBeans);
}
public IphoneData mIphoneData;
public IphonePresenter(IphoneData iphoneData) {
mIphoneData = iphoneData;
}
}
适配器
/**
* date:2018/11/20
* author:QMY(QMY)
* function:
*/
public class Madapter extends BaseExpandableListAdapter {
private final MainActivity mainActivity;
private final List<Iphone.DataBean> list;
public Madapter(MainActivity mainActivity) {
this.mainActivity=mainActivity;
list = new ArrayList<>();
}
@Override
public int getGroupCount() {
return list.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return list.get(groupPosition).getList().size();
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder gvh;
if (convertView==null){
gvh = new GroupViewHolder();
convertView = View.inflate(mainActivity,R.layout.group,null);
gvh.tv = convertView.findViewById(R.id.tv);
gvh.group_check = convertView.findViewById(R.id.group_check);
convertView.setTag(gvh);
}else {
gvh = (GroupViewHolder) convertView.getTag();
}
gvh.tv.setText(list.get(groupPosition).getSellerName());
根据当前商家的所有商品,确定该商家的checkbox是否被选中
boolean sellerChildItemSeled = isSellerChildItemSeled(groupPosition);
//更新
gvh.group_check.setChecked(sellerChildItemSeled);
//点击商家复选框
gvh.group_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mShopCart.selectGroup(groupPosition);
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder cvh;
if (convertView==null){
cvh = new ChildViewHolder();
convertView = View.inflate(mainActivity,R.layout.child,null);
cvh.title = convertView.findViewById(R.id.title);
cvh.price = convertView.findViewById(R.id.price);
cvh.image = convertView.findViewById(R.id.image);
cvh.child_check = convertView.findViewById(R.id.child_check);
cvh.addremove = convertView.findViewById(R.id.add_remove_view);
convertView.setTag(cvh);
}else {
cvh = (ChildViewHolder) convertView.getTag();
}
cvh.title.setText(list.get(groupPosition).getList().get(childPosition).getTitle());
cvh.price.setText(list.get(groupPosition).getList().get(childPosition).getPrice()+"");
//分离
String images = list.get(groupPosition).getList().get(childPosition).getImages();
String[] split = images.split("\\|");
ImageLoader.getInstance().displayImage(split[0],
cvh.image,ImageLoderConfigs.getimageoption(mainActivity));
//设置复选框是否选中
cvh.child_check.setChecked(list.get(groupPosition).getList().get(childPosition).getSelected()==1);
//设置组合式自定义控件内部的数量
cvh.addremove.setNumber(list.get(groupPosition).getList().get(childPosition).getNum());
//点击子条目
cvh.child_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mShopCart.secectChild(groupPosition,childPosition);
}
});
//加减器
cvh.addremove.NumberChanged(new AddRemoveView.Number() {
@Override
public void Numbers(int number) {
mShopCart.numberchanged(groupPosition,childPosition,number);
}
});
return convertView;
}
点击商家条目时
//判断商家的子条目是否全被选中
public boolean isSellerChildItemSeled(int groupPosition){
//拿到商家所有的商品
List<Iphone.DataBean.ListBean> listBeans = list.get(groupPosition).getList();
//Bean类中有一个selected来判断是否选中,未选中是0
for (Iphone.DataBean.ListBean listBean : listBeans) {
//只要有一个未选中,商家就直接未选中
if (listBean.getSelected()==0) {
return false;
}
}
return true;
}
//当商家得checkbox被点击得时候调用,(全选或全不选)
public void SellerSeled(int groupPosition,boolean isSelected){
//获取子元素
List<Iphone.DataBean.ListBean> listBeans = list.get(groupPosition).getList();
for (int i = 0; i<listBeans.size(); i++) {
Iphone.DataBean.ListBean listBean = listBeans.get(i);
listBean.setSelected(isSelected ? 1 : 0);
}
}
/点击子条目时
//当点击子条目的checkbox
public void childSeled(int groupPosition,int childPosition){
//获取子条目
Iphone.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
listBean.setSelected(listBean.getSelected()==0 ? 1 : 0);
}
///全选按钮时
//判断所有商品是否被选中
public boolean isAllSeled(){
//遍历商家条目
for (int i=0;i<list.size();i++){
List<Iphone.DataBean.ListBean> listBeans = this.list.get(i).getList();
//遍历子条目
for (int j=0;j<listBeans.size();j++){
if (listBeans.get(j).getSelected()==0){
return false;
}
}
}
return true;
}
//点击全选按钮时(全选或全不选)
public void onAllChecked(boolean selected){
for (int i=0;i<list.size();i++){
List<Iphone.DataBean.ListBean> listBeans = this.list.get(i).getList();
for (int j=0;j<listBeans.size();j++){
listBeans.get(j).setSelected(selected ? 1 : 0);
}
}
}
//加减器
public void NumberChanged(int groupPosition,int childPosition,int number){
Iphone.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
listBean.setNum(number);
}
//接口
public interface ShopCart{
//点击组条目checkbox
void selectGroup(int groupPosition);
//点击子条目的checkbox
void secectChild(int groupPosition,int childPosition);
//点击加减器
void numberchanged(int groupPosition,int childPosition,int number);
}
//计算商品总数量
public int ProducttotalNumber(){
int totalnumber = 0;
for (int i=0;i<list.size();i++){
List<Iphone.DataBean.ListBean> listBeans = this.list.get(i).getList();
for (int j=0;j<listBeans.size();j++){
if (listBeans.get(j).getSelected()==1){ //选中
int num = listBeans.get(j).getNum();
totalnumber+=num;
}
}
}
return totalnumber;
}
//总价钱
public float totalPrice(){
int totalPrice=0;
for (int i=0;i<list.size();i++){
List<Iphone.DataBean.ListBean> listBeans = this.list.get(i).getList();
for (int j=0;j<listBeans.size();j++){
if (listBeans.get(j).getSelected()==1){ //选中
int num = listBeans.get(j).getNum();
double price = listBeans.get(j).getPrice();
totalPrice += price *num;
}
}
}
return totalPrice;
}
public ShopCart mShopCart;
public void setShopCart(ShopCart shopCart){
mShopCart = shopCart;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
@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;
}
public void setData(List<Iphone.DataBean> data) {
this.list.clear();
list.addAll(data);
notifyDataSetChanged();
}
class GroupViewHolder{
TextView tv;
CheckBox group_check;
}
class ChildViewHolder{
TextView title,price;
ImageView image;
CheckBox child_check;
AddRemoveView addremove;
}
}
activity_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=".MainActivity">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/expandlistview"
android:layout_weight="9"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<CheckBox
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="全选"
android:id="@+id/allcheck"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:text="合计:¥0.00"
android:gravity="center"
android:id="@+id/allprice"/>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="结算(0)"
android:id="@+id/pay"/>
</LinearLayout>
</LinearLayout>
group布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/group_check"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商家"
android:textSize="20sp"/>
</LinearLayout>
child布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:gravity="center_vertical"
android:layout_height="120dp"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBox
android:id="@+id/child_check"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<ImageView
android:id="@+id/image"
android:layout_height="100dp"
android:layout_width="100dp"
android:src="@color/colorPrimary"
android:layout_marginLeft="20dp"/>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<TextView
android:id="@+id/title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="商品标题"/>
<TextView
android:id="@+id/price"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="¥0.0"
android:layout_marginTop="10dp"/>
</LinearLayout>
<com.bwie.shopcart.AddRemoveView
android:id="@+id/add_remove_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginRight="10dp"/>
</LinearLayout>