常用依赖包
1.布局
compile 'com.github.bumptech.glide:glide:3.6.0'
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
实体类
购物车实体类自己生成
一级列表实体类
public class Group {
private boolean flag;
private String name;
public Group(boolean flag, String name) {
this.flag = flag;
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二级列表实体类
public class Child {
private boolean flag;
private String title;
private double price;
private String image;
private int unm;
private int pid;
public Child(boolean flag, String title, double price, String image, int unm,int pid) {
this.flag = flag;
this.title = title;
this.price = price;
this.image = image;
this.unm = unm;
this.pid = pid;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public int getUnm() {
return unm;
}
public void setUnm(int unm) {
this.unm = unm;
}
}
删除实体类
public class Delete {
private String msg;
private String code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
自定义加减器
1.布局
<?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">
<TextView
android:textSize="20dp"
android:id="@+id/delete"
android:text="-"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:textSize="20dp"
android:id="@+id/count"
android:text=""
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:textSize="20dp"
android:id="@+id/add"
android:text="+"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2.继承控件
public class ShopAddDelete extends RelativeLayout{
public TextView count;
public ShopAddDelete(Context context) {
this(context,null);
}
public ShopAddDelete(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public ShopAddDelete(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs, defStyleAttr);
}
private OnAddDeleteClickListener listener;
//对外提供一个点击的回调接口
public interface OnAddDeleteClickListener{
void onAddClick(View v);
void onDelClick(View v);
}
public void setOnAddDeleteClick(OnAddDeleteClickListener listener){
this.listener = listener;
}
private void initView(final Context context, AttributeSet attrs, int defStyleAttr) {
View view = View.inflate(context, R.layout.add_delete, this);
TextView delete = (TextView)view.findViewById(R.id.delete);
count = (TextView)view.findViewById(R.id.count);
TextView add = (TextView)view.findViewById(R.id.add);
delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.onDelClick(view);
}
});
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.onAddClick(view);
}
});
}
//对外提供设置EditText值的方法
public void setNumber(int number){
count.setText(number + "");
}
//得到控件原来的值,并转成int类型
public int getNumber(){
int number = Integer.parseInt(count.getText().toString().trim());
return number;
}
main布局
<?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">
<TextView
android:text="〈"
android:layout_width="25dp"
android:layout_height="25dp"
android:textSize="20dp"
android:id="@+id/textView" />
<TextView
android:id="@+id/shop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textView"
android:layout_centerHorizontal="true"
android:text="购物车(0)"
android:textSize="20dp"/>
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/shop"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:text="编辑"
android:textSize="20dp"/>
<View
android:background="#706a70"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/shop"/>
<RelativeLayout
android:id="@+id/re"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<CheckBox
android:text="全选"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkBox" />
<TextView
android:id="@+id/price"
android:text="合计:0.00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/btn"
android:text="去支付(0)"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<ExpandableListView
android:id="@+id/expandablelistview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"></ExpandableListView>
</RelativeLayout>
使用MVP框架请求网络MainActivity中获取数据
public class MainActivity extends AppCompatActivity implements IView {
public static CheckBox checkbox;
@BindView(R.id.textView)
TextView textView;
@BindView(R.id.shop)
TextView shop;
@BindView(R.id.textView3)
TextView textView3;
@BindView(R.id.checkBox)
CheckBox checkBox;
@BindView(R.id.price)
TextView price;
@BindView(R.id.re)
RelativeLayout re;
@BindView(R.id.expandablelistview)
ExpandableListView expandablelistview;
@BindView(R.id.btn)
Button btn;
private List<Group> grouplist = new ArrayList<>();
private List<List<Child>> childlist = new ArrayList<>();
private ExpandAdapter expandAdapter;
private Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//http://120.27.23.105/product/getCarts?source=android&uid=1653
ButterKnife.bind(this);
checkbox = (CheckBox) findViewById(R.id.checkBox);
expandAdapter = new ExpandAdapter(this, grouplist, childlist);
expandablelistview.setAdapter(expandAdapter);
expandablelistview.setGroupIndicator(null);
p();
textView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(textView3.getText().toString().trim().equals("编辑")){
textView3.setText("完成");
ExpandAdapter.q = 1;
expandAdapter.notifyDataSetChanged();
}else{
textView3.setText("编辑");
ExpandAdapter.q = 0;
expandAdapter.notifyDataSetChanged();
}
}
});
}
public void p() {
presenter = new Presenter(this);
Map<String, String> map = new HashMap();
map.put("source", "android");
map.put("uid", "4043");
presenter.get("http://120.27.23.105/", map);
}
public void js() {
double p = 0;
int s = 0;
for (int i = 0; i < childlist.size(); i++) {
for (int j = 0; j < childlist.get(i).size(); j++) {
if (childlist.get(i).get(j).isFlag()) {
double price = childlist.get(i).get(j).getPrice();
int num = childlist.get(i).get(j).getUnm();
p += price * num;
s++;
}
}
}
DecimalFormat df = new DecimalFormat("######0.00");
price.setText("总价:" + df.format(p));
btn.setText("去支付("+s+")");
shop.setText("购物车("+s+")");
}
@OnClick(R.id.checkBox)
public void onViewClicked() {
for (int i = 0; i < grouplist.size(); i++) {
grouplist.get(i).setFlag(checkBox.isChecked());
}
for (int i = 0; i < childlist.size(); i++) {
for (int j = 0; j < childlist.get(i).size(); j++) {
childlist.get(i).get(j).setFlag(checkBox.isChecked());
}
}
js();
expandAdapter.notifyDataSetChanged();
}
@Override
public void onSuccess(Object o) {
if (o != null) {
CarBean b = (CarBean) o;
List<CarBean.DataBean> data = b.getData();
for (int i = 0; i < data.size(); i++) {
grouplist.add(new Group(false, data.get(i).getSellerName()));
List<CarBean.DataBean.ListBean> list = data.get(i).getList();
List<Child> cl = new ArrayList<>();
for (int j = 0; j < list.size(); j++) {
int pid = list.get(j).getPid();
cl.add(new Child(false, list.get(j).getTitle(), (float) list.get(j).getPrice(), list.get(j).getImages(), list.get(j).getNum(),pid));
}
childlist.add(cl);
}
for (int s = 0; s < expandAdapter.getGroupCount(); s++) {
expandablelistview.expandGroup(s);
}
expandAdapter.notifyDataSetChanged();
}
}
@Override
public void onFailed(Exception e) {
}
@Override
protected void onDestroy() {
super.onDestroy();
if(presenter!=null){
presenter.detatch();
}
}
}
适配器布局
一级条目
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:id="@+id/main_check_all"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="11dp"
android:layout_marginStart="11dp"
android:text="TextView"
android:layout_alignBaseline="@+id/main_check_all"
android:layout_alignBottom="@+id/main_check_all"
android:layout_toRightOf="@+id/main_check_all"
android:layout_toEndOf="@+id/main_check_all" />
</RelativeLayout>
二级条目
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:id="@+id/main_check_all"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_below="@+id/textView4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="90dp"
android:layout_height="90dp"
app:srcCompat="@mipmap/ic_launcher"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/main_check_all"
android:layout_toEndOf="@+id/main_check_all" />
<TextView
android:id="@+id/textView4"
android:textSize="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/imageView3"
android:layout_toEndOf="@+id/imageView3" />
<TextView
android:id="@+id/textView5"
android:textSize="10dp"
android:textColor="#c91622"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:layout_below="@+id/main_check_all"
android:layout_toRightOf="@+id/imageView3"
android:layout_toEndOf="@+id/imageView3" />
<com.example.fanjie.goodscart.view.ShopAddDelete
android:id="@+id/ad"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_alignBottom="@+id/imageView3"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="删除"
android:visibility="gone"/>
</RelativeLayout>
二级列表适配器
public class ExpandAdapter extends BaseExpandableListAdapter implements IView {
private Context context;
private List<Group> data1;
private List<List<Child>> data2;
public static int q = 0;
private Presenter presenter;
public ExpandAdapter(Context context, List<Group> data1, List<List<Child>> data2) {
this.context = context;
this.data1 = data1;
this.data2 = data2;
}
@Override
public int getGroupCount() {
return data1.size();
}
@Override
public int getChildrenCount(int i) {
return data2.get(i).size();
}
@Override
public Object getGroup(int i) {
return data1.get(i);
}
@Override
public Object getChild(int i, int i1) {
return data2.get(i).get(i1);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public void onSuccess(Object o) {
data1.clear();
data2.clear();
Delete d = (Delete) o;
Toast.makeText(context,d.getMsg(),Toast.LENGTH_SHORT).show();
MainActivity m = (MainActivity) context;
m.p();
}
@Override
public void onFailed(Exception e) {
}
class ViewHolder{
CheckBox check;
TextView tv;
}
class ViewHolder2{
CheckBox check;
ImageView image;
TextView tv1,tv2;
ShopAddDelete ad;
Button button;
}
@Override
public View getGroupView(final int i, final boolean b, View view, ViewGroup viewGroup) {
final ViewHolder holder;
if(view==null){
holder = new ViewHolder();
view = View.inflate(context, R.layout.group_item,null);
holder.check = (CheckBox)view.findViewById(R.id.main_check_all);
holder.tv = (TextView)view.findViewById(R.id.textView3);
view.setTag(holder);
}else{
holder = (ViewHolder) view.getTag();
}
holder.tv.setText(data1.get(i).getName());
holder.check.setChecked(data1.get(i).isFlag());
holder.check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivity m = (MainActivity) context;
//Group布尔值变成选中状态
data1.get(i).setFlag(holder.check.isChecked());
//遍历Group集合
for (int i = 0; i < data1.size(); i++) {
//如果有一个未选中 全选变成false并跳出
if(!data1.get(i).isFlag()){
m.checkbox.setChecked(false);
break;
}else{//全部选中 全选变成true
m.checkbox.setChecked(true);
}
}
//Child集合布尔值为选中的状态
for (int j=0;j<data2.get(i).size();j++){
data2.get(i).get(j).setFlag(holder.check.isChecked());
}
//刷新适配器
notifyDataSetChanged();
//调用计算的方法
m.js();
}
});
return view;
}
@Override
public View getChildView(final int i, final int i1, final boolean b, View view, ViewGroup viewGroup) {
final ViewHolder2 holder2;
if(view==null){
holder2 = new ViewHolder2();
view = View.inflate(context, R.layout.child_item,null);
holder2.check = (CheckBox)view.findViewById(R.id.main_check_all);
holder2.image = (ImageView)view.findViewById(R.id.imageView3);
holder2.tv1 = (TextView)view.findViewById(R.id.textView4);
holder2.tv2 = (TextView)view.findViewById(R.id.textView5);
holder2.ad = (ShopAddDelete)view.findViewById(R.id.ad);
holder2.button = (Button)view.findViewById(R.id.button);
view.setTag(holder2);
}else{
holder2 = (ViewHolder2) view.getTag();
}
if(q==0){
holder2.button.setVisibility(View.GONE);
}else{
holder2.button.setVisibility(View.VISIBLE);
}
String images = data2.get(i).get(i1).getImage();
String[] split = images.split("!");
Glide.with(context).load(split[0]).into(holder2.image);
holder2.tv1.setText(data2.get(i).get(i1).getTitle());
holder2.tv2.setText(data2.get(i).get(i1).getPrice()+"");
holder2.ad.count.setText(data2.get(i).get(i1).getUnm()+"");
holder2.check.setChecked(data2.get(i).get(i1).isFlag());
holder2.check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivity m = (MainActivity) context;
//Child布尔值变成选中状态
data2.get(i).get(i1).setFlag(holder2.check.isChecked());
//遍历Ghild集合
for(int i=0;i<data2.size();i++){
for(int j=0;j<data2.get(i).size();j++){
//如果有一个未选中 全选与商家按钮变成false并跳出
if(!data2.get(i).get(j).isFlag()){
data1.get(i).setFlag(false);
m.checkbox.setChecked(false);
break;
}else{//全部选中 全选与商家按钮变成true
data1.get(i).setFlag(true);
m.checkbox.setChecked(true);
}
}
}
//二次遍历
for(int i=0;i<data1.size();i++){
boolean flag = data1.get(i).isFlag();
if(flag){
m.checkbox.setChecked(true);
}else{
m.checkbox.setChecked(false);
break;
}
}
notifyDataSetChanged();
//调用计算的方法
m.js();
}
});
holder2.button.setOnClickListener(new View.OnClickListener() {
private DPresenter dPresenter;
@Override
public void onClick(View view) {
//http://120.27.23.105/product/deleteCart?source=android&uid=1653&pid=2
dPresenter = new DPresenter(ExpandAdapter.this);
Map<String,String> map = new HashMap<String, String>();
map.put("source","android");
map.put("uid","4043");
map.put("pid",data2.get(i).get(i1).getPid()+"");
dPresenter.get("http://120.27.23.105/",map);
}
});
holder2.ad.setOnAddDeleteClick(new ShopAddDelete.OnAddDeleteClickListener() {
@Override
public void onAddClick(View v) {
MainActivity m = (MainActivity) context;
int number = holder2.ad.getNumber();
number++;
holder2.ad.setNumber(number);
Log.i("TAG",number+"");
data2.get(i).get(i1).setUnm(number);
notifyDataSetChanged();
//调用计算的方法
m.js();
}
@Override
public void onDelClick(View v) {
MainActivity m = (MainActivity) context;
int number = holder2.ad.getNumber();
number--;
if(number>0){
holder2.ad.setNumber(number);
data2.get(i).get(i1).setUnm(number);
}else{
Toast.makeText(context,"最小数量为1",Toast.LENGTH_SHORT).show();
}
notifyDataSetChanged();
//调用计算的方法
m.js();
}
});
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
}