

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>