//导入依赖
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
compile 'com.jakewharton:butterknife:8.8.1'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.facebook.fresco:fresco:0.12.0'
compile 'com.facebook.fresco:animated-base-support:0.12.0'
compile 'com.facebook.fresco:animated-webp:0.12.0'
compile 'com.facebook.fresco:webpsupport:0.12.0'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.google.code.gson:gson:2.8.1'
compile 'org.greenrobot:eventbus:3.1.1'
//权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
// MyAdapter 适配器
public class MyAdapter extends BaseExpandableListAdapter {
private Context context;
private List<DatasBean> groupList;
private List<List<DatasBean.ListBean>> childList;
public MyAdapter(Context context, List<DatasBean> groupList, List<List<DatasBean.ListBean>> childList) {
this.context =context;
this.groupList = groupList;
this.childList = childList;
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int i) {
return childList.get(i).size();
}
@Override
public Object getGroup(int i) {
return groupList.get(i);
}
@Override
public Object getChild(int i, int i1) {
return childList.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 View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
final GroupViewHolder holder;
if (view == null) {
holder = new GroupViewHolder();
view = view.inflate(context, R.layout.group_layout, null);
holder.cbGroup = view.findViewById(R.id.cb_parent);
holder.tv_number = view.findViewById(R.id.tv_number);
view.setTag(holder);
} else {
holder = (GroupViewHolder) view.getTag();
}
final DatasBean dataBean = groupList.get(i);
holder.cbGroup.setChecked(dataBean.isChecked());
// holder.tv_number.setText(dataBean.getTitle());
holder.tv_number.setText(dataBean.getSellerName());
//一级checkbox
holder.cbGroup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataBean.setChecked(holder.cbGroup.isChecked());
changeChildCbState(i, holder.cbGroup.isChecked());
EventBus.getDefault().post(compute());
changeAllCbState(isAllGroupCbSelected());
notifyDataSetChanged();
}
});
return view;
}
@Override
public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
final ChildViewHolder holder;
if (view == null) {
holder = new ChildViewHolder();
view = view.inflate(context,R.layout.child_layout, null);
holder.cbChild = view.findViewById(R.id.cb_child);
holder.tv_tel = view.findViewById(R.id.tv_tel);
holder.draweeView = (SimpleDraweeView) view.findViewById(R.id.my_image_view);
holder.tv_price = view.findViewById(R.id.tv_pri);
holder.tv_del = view.findViewById(R.id.tv_del);
holder.adv = view.findViewById(R.id.adv_main);
view.setTag(holder);
} else {
holder = (ChildViewHolder) view.getTag();
}
final DatasBean.ListBean datasBean = childList.get(i).get(i1);
holder.cbChild.setChecked(datasBean.isChecked());
holder.tv_tel.setText(datasBean.getTitle());
holder.tv_price.setText("¥"+datasBean.getPrice() );
holder.adv.setNumber(datasBean.getNum());
String images = datasBean.getImages().trim();
String[] split = images.split("[|]");
holder.draweeView.setImageURI(split[0]);
//二级checkbox
holder.cbChild.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//设置该条目对象里的checked属性值
datasBean.setChecked(holder.cbChild.isChecked());
PriceAndCountEvent priceAndCountEvent = compute();
EventBus.getDefault().post(priceAndCountEvent);
if (holder.cbChild.isChecked()) {
//当前checkbox是选中状态
if (isAllChildCbSelected(i)) {
changGroupCbState(i, true);
changeAllCbState(isAllGroupCbSelected());
}
} else {
changGroupCbState(i, false);
changeAllCbState(isAllGroupCbSelected());
}
notifyDataSetChanged();
}
});
holder.adv.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {
@Override
public void onAddClick(View v) {
Log.i("TAG", "onAddClick: 执行");
int origin = holder.adv.getNumber();
origin++;
// holder.adv.setNumber(origin);
int num = datasBean.getNum();
num++;
holder.adv.setNumber(num);
datasBean.setNum(num);
if (holder.cbChild.isChecked()) {
EventBus.getDefault().post(compute());
}
}
@Override
public void onDelClick(View v) {
int origin = holder.adv.getNumber();
// int num = datasBean.getNum();
origin--;
if (origin == 0) {
Toast.makeText(context,"最小数量为1",Toast.LENGTH_SHORT).show();
return ;
}
holder.adv.setNumber(origin);
datasBean.setNum(origin);
if (holder.cbChild.isChecked()) {
EventBus.getDefault().post(compute());
}
}
});
//删除
holder.tv_del.setOnClickListener(new View.OnClickListener() {
private AlertDialog dialog;
@Override
public void onClick(View v) {
final List<DatasBean.ListBean> datasBeen = childList.get(i);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage("确认是否删除?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int ii) {
DatasBean.ListBean remove = datasBeen.remove(i1);
if (datasBeen.size() == 0) {
childList.remove(i);
groupList.remove(i);
int pid = datasBean.getPid();
SomeId someId = new SomeId();
someId.setPid(pid+"");
EventBus.getDefault().post(someId);
}
EventBus.getDefault().post(compute());
notifyDataSetChanged();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
dialog = builder.create();
dialog.show();
}
});
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
class GroupViewHolder {
CheckBox cbGroup;
TextView tv_number;
}
class ChildViewHolder {
CheckBox cbChild;
TextView tv_tel;
TextView tv_content;
TextView tv_time;
// ImageView imgIcon;
SimpleDraweeView draweeView;
TextView tv_price;
TextView tv_del;
ImageView iv_del;
ImageView iv_add;
TextView tv_num;
AddDeleteView adv;
}
/**
* 改变全选的状态
*
* @param flag
*/
private void changeAllCbState(boolean flag) {
MessageEvent messageEvent = new MessageEvent();
messageEvent.setChecked(flag);
EventBus.getDefault().post(messageEvent);
}
/**
* 改变一级列表checkbox状态
*
* @param groupPosition
*/
private void changGroupCbState(int groupPosition, boolean flag) {
// GoosBean.DataBean dataBean = groupList.get(groupPosition);
DatasBean dataBean = groupList.get(groupPosition);
dataBean.setChecked(flag);
}
/**
* 改变二级列表checkbox状态
*
* @param groupPosition
* @param flag
*/
private void changeChildCbState(int groupPosition, boolean flag) {
List<DatasBean.ListBean> datasBeen = childList.get(groupPosition);
for (int i = 0; i < datasBeen.size(); i++) {
DatasBean.ListBean datasBean = datasBeen.get(i);
datasBean.setChecked(flag);
}
}
/**
* 判断一级列表是否全部选中
*
* @return
*/
private boolean isAllGroupCbSelected() {
for (int i = 0; i < groupList.size(); i++) {
DatasBean dataBean = groupList.get(i);
if (!dataBean.isChecked()) {
return false;
}
}
return true;
}
/**
* 判断二级列表是否全部选中
*
* @param groupPosition
* @return
*/
private boolean isAllChildCbSelected(int groupPosition) {
List<DatasBean.ListBean> datasBeen = childList.get(groupPosition);
for (int i = 0; i < datasBeen.size(); i++) {
DatasBean.ListBean datasBean = datasBeen.get(i);
if (!datasBean.isChecked()) {
return false;
}
}
return true;
}
/**
* 计算列表中,选中的钱和数量
*/
private PriceAndCountEvent compute() {
int count = 0;
int price = 0;
for (int i = 0; i < childList.size(); i++) {
List<DatasBean.ListBean> datasBeen = childList.get(i);
for (int j = 0; j < datasBeen.size(); j++) {
DatasBean.ListBean datasBean = datasBeen.get(j);
if (datasBean.isChecked()) {
price += datasBean.getNum() * datasBean.getPrice();
count += datasBean.getNum();
}
}
}
PriceAndCountEvent priceAndCountEvent = new PriceAndCountEvent();
priceAndCountEvent.setCount(count);
priceAndCountEvent.setPrice(price);
return priceAndCountEvent;
}
/**
* 设置全选、反选
*
* @param flag
*/
public void changeAllListCbState(boolean flag) {
for (int i = 0; i < groupList.size(); i++) {
changGroupCbState(i, flag);
changeChildCbState(i, flag);
}
EventBus.getDefault().post(compute());
notifyDataSetChanged();
}
}
// ApiService
public interface ApiService {
// http://120.27.23.105/product/deleteCart?uid=72&pid=1
@GET("product/getCarts")
Flowable<MessageBean<List<DatasBean>>> getDatas(@Query("uid") String uid);
@GET("product/deleteCart")
Flowable<MessageBean> deleteData(@Query("uid") String uid, @Query("pid") String pid);
}
//自定义控件 AddDeleteView
public class AddDeleteView extends LinearLayout {
private OnAddDelClickListener listener;
private TextView et_number;
public void setOnAddDelClickListener(OnAddDelClickListener listener) {
if (listener != null) {
this.listener = listener;
}
}
public interface OnAddDelClickListener{
void onAddClick(View v);
void onDelClick(View v);
}
public AddDeleteView(Context context) {
this(context,null);
}
public AddDeleteView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AddDeleteView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context,attrs,defStyleAttr);
}
private void initView(Context context,AttributeSet attrs,int defStyleAttr){
View.inflate(context, R.layout.layout_add_delete,this);
Button but_add = findViewById(R.id.but_add);
Button but_delete = findViewById(R.id.but_delete);
et_number = findViewById(R.id.et_number);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AddDeleteViewStyle);
String left_text = typedArray.getString(R.styleable.AddDeleteViewStyle_left_text);
String middle_text = typedArray.getString(R.styleable.AddDeleteViewStyle_middle_text);
String right_text = typedArray.getString(R.styleable.AddDeleteViewStyle_right_text);
but_delete.setText(left_text);
but_add.setText(right_text);
et_number.setText(middle_text);
//释放资源
typedArray.recycle();
but_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.onAddClick(view);
}
});
but_delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.onDelClick(view);
}
});
}
/**
* 对外提供设置EditText值的方法
*/
public void setNumber(int number){
if (number>0){
et_number.setText(number+"");
}
}
/**
* 得到控件原来的值
*/
public int getNumber(){
int number = 0;
try {
String numberStr = et_number.getText().toString().trim();
number = Integer.valueOf(numberStr);
} catch (Exception e) {
number = 0;
}
return number;
}
}
// MessageEvent
public class MessageEvent {
private boolean checked;
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
// PriceAndCountEvent
public class PriceAndCountEvent { private int price; private int count; public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
//LoggingInterceptor
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
HttpUrl url=original.url().newBuilder()
.addQueryParameter("source","android")
.build();
//添加请求头
Request request = original.newBuilder()
.url(url)
.build();
return chain.proceed(request);
}
}
M层
//DelModel
public class DelModel implements IModel{
private DelPresenter presenter;
public DelModel(DelPresenter presenter){
this.presenter = presenter;
}
@Override
public void getData(String uid,String pid) {
Flowable<MessageBean> delFlowable = RetrofitUtils.getInstance().getApiService().deleteData(uid,pid);
presenter.delData(delFlowable);
}
}
// IModel
public interface IModel {
void getData(String uid, String pid);
}
//NewsModel
public class NewsModel implements IModel{
private NewsPresenter presenter;
public NewsModel(NewsPresenter presenter){
this.presenter = (NewsPresenter) presenter;
}
@Override
public void getData(String uid,String pid) {
Flowable<MessageBean<List<DatasBean>>> flowable = RetrofitUtils.getInstance().getApiService().getDatas(uid);
presenter.getNews(flowable);
}
}
// V层
// Iview
public interface Iview {
void onSuccess(Object o);
void onFailed(Exception e);
void delSuccess(MessageBean listMessageBean);
}
P层
// BasePresenter
//DelPresenterpublic interface BasePresenter { void getData(String uid, String pid); }
//NewsPresenterpublic class DelPresenter implements BasePresenter{ private Iview iv; private DisposableSubscriber subscriber2; public void attachView(Iview iv) { this.iv = iv; } public void detachView() { if (iv != null) { iv = null; } if (!subscriber2.isDisposed()){ subscriber2.dispose(); } } @Override public void getData(String uid,String pid) { DelModel model = new DelModel(this); model.getData(uid,pid); } public void delData(Flowable<MessageBean> delFlowable) { subscriber2 = delFlowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSubscriber<MessageBean>() { @Override public void onNext(MessageBean listMessageBean) { if (listMessageBean != null) { iv.delSuccess(listMessageBean); } } @Override public void onError(Throwable t) { iv.onFailed((Exception) t); } @Override public void onComplete() { } }); } }
public class NewsPresenter implements BasePresenter { private Iview iv; private DisposableSubscriber subscriber1; public void attachView(Iview iv) { this.iv = iv; } public void detachView() { if (iv != null) { iv = null; } if (!subscriber1.isDisposed()){ subscriber1.dispose(); } } @Override public void getData(String uid,String pid) { NewsModel model = new NewsModel(this); model.getData(uid,pid); } public void getNews(Flowable<MessageBean<List<DatasBean>>> flowable) { subscriber1 = flowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSubscriber<MessageBean<List<DatasBean>>>() { @Override public void onNext(MessageBean<List<DatasBean>> listMessageBean) { if (listMessageBean != null) { List<DatasBean> list = listMessageBean.getData(); if (list != null) { iv.onSuccess(list); } } } @Override public void onError(Throwable t) { iv.onFailed((Exception) t); } @Override public void onComplete() { } }); } }
//Utils
// RetrofitUtilspublic class RetrofitUtils { private static volatile RetrofitUtils instance; private ApiService apiService; private OkHttpClient client = new OkHttpClient .Builder() .addInterceptor((Interceptor) new LoggingInterceptor()) .build(); private RetrofitUtils(){ Retrofit retrofit = new Retrofit.Builder() .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .baseUrl("http://120.27.23.105/") .build(); apiService = retrofit.create(ApiService.class); } public static RetrofitUtils getInstance(){ if (null==instance){ synchronized (RetrofitUtils.class){ if (instance==null){ instance = new RetrofitUtils(); } } } return instance; } public ApiService getApiService(){ return apiService; } }
//Bean类
DatasBeanpublic class DatasBean { /** * list : [{"bargainPrice":6666,"createtime":"2017-10-10T16:01:31","detailUrl":"https://item.m.jd.com/product/5089273.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8284/363/1326459580/71585/6d3e8013/59b857f2N6ca75622.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9346/182/1406837243/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg","num":1,"pid":46,"price":234,"pscid":39,"selected":0,"sellerid":2,"subhead":"【iPhone新品上市】新一代iPhone,让智能看起来更不一样","title":"Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机"}] * sellerName : 商家2 * sellerid : 2 */ private String sellerName; private String sellerid; private List<ListBean> list; private boolean checked; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public String getSellerName() { return sellerName; } public void setSellerName(String sellerName) { this.sellerName = sellerName; } public String getSellerid() { return sellerid; } public void setSellerid(String sellerid) { this.sellerid = sellerid; } public List<ListBean> getList() { return list; } public void setList(List<ListBean> list) { this.list = list; } public static class ListBean { /** * bargainPrice : 6666 * createtime : 2017-10-10T16:01:31 * detailUrl : https://item.m.jd.com/product/5089273.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends * images : https://m.360buyimg.com/n0/jfs/t8284/363/1326459580/71585/6d3e8013/59b857f2N6ca75622.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9346/182/1406837243/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg * num : 1 * pid : 46 * price : 234 * pscid : 39 * selected : 0 * sellerid : 2 * subhead : 【iPhone新品上市】新一代iPhone,让智能看起来更不一样 * title : Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机 */ private boolean checked; private double bargainPrice; private String createtime; private String detailUrl; private String images; private int num; private int pid; private double price; private int pscid; private int selected; private int sellerid; private String subhead; private String title; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSelected() { return selected; } public void setSelected(int selected) { this.selected = selected; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }
//MessageBeanpublic class MessageBean<T> { /** * msg : 请求成功 * code : 0 * data : [] */ private String msg; private String code; private T data; 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; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
//SomeIdpublic class SomeId { private String pid; public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } }
//MainActivitypublic class MainActivity extends AppCompatActivity implements Iview { private String uid = "1000"; private NewsPresenter presenter; private CheckBox mCheckbox2; private ExpandableListView mElv; /** * 0 */ private TextView mTvPrice; /** * 结算(0) */ private TextView mTvNum; private MyAdapter adapter; private List<DatasBean> groupList = new ArrayList<>(); private List<List<DatasBean.ListBean>> childList = new ArrayList<>(); private String pid; private DelPresenter delPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); presenter = new NewsPresenter(); presenter.attachView(this); delPresenter = new DelPresenter(); delPresenter.attachView(this); initView(); adapter = new MyAdapter(this, groupList, childList); mElv.setAdapter(adapter); mCheckbox2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.changeAllListCbState(mCheckbox2.isChecked()); } }); } private void initView() { mElv = (ExpandableListView) findViewById(R.id.elv); mCheckbox2 = (CheckBox) findViewById(R.id.checkbox2); mTvPrice = (TextView) findViewById(R.id.tv_price); mTvNum = (TextView) findViewById(R.id.tv_num); } @Override public void onSuccess(Object o) { if(o!=null){ List<DatasBean> list = (List<DatasBean> )o; if(list!=null){ groupList.addAll(list); for (int i = 0; i < list.size(); i++) { List<DatasBean.ListBean> datas = list.get(i).getList(); childList.add(datas); } adapter.notifyDataSetChanged(); mCheckbox2.setChecked(true); adapter.changeAllListCbState(true); mElv.setGroupIndicator(null); for (int i=0;i<groupList.size();i++){ mElv.expandGroup(i); } } } } @Override public void onFailed(Exception e) { } public void delSuccess(MessageBean listMessageBean) { Toast.makeText(this,listMessageBean.getMsg(),Toast.LENGTH_SHORT).show(); } @Override protected void onResume() { super.onResume(); presenter.getData(uid,pid); } @Subscribe public void onMessageEvent(MessageEvent event) { mCheckbox2.setChecked(event.isChecked()); } @Subscribe public void onMessageEvent(PriceAndCountEvent event) { mTvNum.setText("结算(" + event.getCount() + ")"); mTvPrice.setText("¥"+event.getPrice() ); } @Subscribe public void onMessageEvent(SomeId event) { pid = event.getPid(); Log.e("zxz","我得到了pid:"+pid); delPresenter.getData(uid,pid); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); if (presenter != null) { presenter.detachView(); } } }
//此类需要在配置文件中进行初始化public class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
//布局
activity_main<?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="bwie.com.cart.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="购物车" android:textColor="#ff3660" android:textSize="25sp" /> <ExpandableListView android:id="@+id/elv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="@android:color/white" android:gravity="center_vertical"> <CheckBox android:id="@+id/checkbox2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:focusable="false" /> <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/checkbox2" android:gravity="center_vertical" android:text="全选" android:textSize="20sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="合计 :" /> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginLeft="10dp" android:paddingRight="10dp" android:text="0" android:textColor="@android:color/holo_red_light" /> <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="50dp" android:background="@android:color/holo_red_dark" android:gravity="center" android:padding="10dp" android:text="结算(0)" android:textColor="@android:color/white" /> </LinearLayout> </RelativeLayout> </LinearLayout>
child_layout<?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" xmlns:fresco="http://schemas.android.com/tools" android:orientation="vertical" android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal"> <CheckBox android:layout_marginLeft="20dp" android:id="@+id/cb_child" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" /> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="80dp" android:layout_height="80dp" fresco:placeholderImage="@mipmap/ic_launcher" /> <RelativeLayout android:layout_marginLeft="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_tel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="iphone6" /> <TextView android:id="@+id/tv_pri" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="¥3000.00" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:gravity="center_vertical"> <custom.AddDeleteView android:id="@+id/adv_main" android:layout_width="wrap_content" android:layout_height="wrap_content" app:left_text="-" app:middle_text="3" app:right_text="+"/> </LinearLayout> </LinearLayout> <TextView android:id="@+id/tv_del" android:layout_width="40dp" android:layout_height="40dp" android:text="删除" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_marginTop="25dp" android:layout_centerVertical="true" android:gravity="center" /> </RelativeLayout> </LinearLayout> </LinearLayout>
group_layout<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:gravity="center" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" > <CheckBox android:id="@+id/cb_parent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginRight="4dp" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:gravity="center" android:minHeight="38dp" android:minWidth="32dp" android:textAppearance="?android:attr/textAppearanceLarge" android:visibility="visible" /> <TextView android:id="@+id/tv_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:layout_toRightOf="@id/cb_parent" android:background="@android:color/white" android:drawablePadding="10dp" android:text="第八号当铺" android:textColor="#666666" android:textSize="18sp" /> </RelativeLayout> </LinearLayout>
layout_add_delete<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <Button android:id="@+id/but_delete" android:layout_width="40dp" android:layout_height="40dp" android:text="-" /> <TextView android:id="@+id/et_number" android:layout_width="40dp" android:inputType="number" android:layout_height="wrap_content" android:gravity="center" /> <Button android:id="@+id/but_add" android:layout_width="40dp" android:layout_height="40dp" android:text="+" /> </LinearLayout> </LinearLayout>
//Values下
attrs<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AddDeleteViewStyle"> <attr name="left_text" format="string"/> <attr name="right_text" format="string"/> <attr name="middle_text" format="string"/> </declare-styleable> </resources>