使用RXjava+Retrofit+MVP实现仿京东购物车
来源:互联网 发布:淘宝宝贝视频怎么上传 编辑:程序博客网 时间:2024/06/07 13:11
添加依赖compile 'com.squareup.okhttp3:okhttp:3.4.1'compile 'com.jakewharton:butterknife:8.8.1'annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'compile 'com.facebook.fresco:fresco:0.12.0'compile 'org.greenrobot:eventbus:3.1.1'compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'compile 'io.reactivex.rxjava2:rxjava:2.1.7'compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'com.squareup.retrofit2:retrofit:2.3.0'compile 'com.squareup.retrofit2:converter-gson:2.3.0'compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'compile 'com.github.bumptech.glide:glide:3.7.0'//添加权限<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"/>
注册清单文件android:name=".api.MyApplication"public interface IView { void onSuccess(Object o); void onFailed(Exception e); void delSuccess(MessageBean listMessageBean);}public interface IModel { void getData(String uid,String pid);}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); }}public interface IPresenter { void getData(String uid,String pid);}public class NewsPresenter implements IPresenter{ 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(); }// if (!subscriber2.isDisposed()){// subscriber2.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() { } }); }}public class RetrofitUtils { private static volatile RetrofitUtils instance; private ApiService apiService; private OkHttpClient client = new OkHttpClient .Builder() .addInterceptor(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; }}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);}public class LoggingInterceptor implements Interceptor { @Override public Response intercept(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); }}public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); }}public class DatasBean {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 {private double bargainPrice; private String createtime; private String detailUrl; private String images; private int num; private int pid; private int price; private int pscid; private int selected; private int sellerid; private String subhead; private String title; private boolean checked; 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 int getPrice() { return price; } public void setPrice(int 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; } }}public 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; }}public class MessageEvent { private boolean checked; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; }}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; }}public class SomeId { private String pid; public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; }}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); }}public class DelPresenter implements IPresenter { 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() { } }); }}
自定义View实现加减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; }}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.tv_content = view.findViewById(R.id.tv_content);// holder.tv_time = view.findViewById(R.id.tv_time);// holder.imgIcon = view.findViewById(R.id.img_icon); 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.iv_add = view.findViewById(R.id.iv_add);// holder.iv_del = view.findViewById(R.id.iv_del);// holder.tv_num = view.findViewById(R.id.tv_num); 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.getType_name()); holder.tv_tel.setText(datasBean.getTitle());// holder.tv_content.setText(datasBean.getMsg());// holder.tv_time.setText(datasBean.getAdd_time()); holder.tv_price.setText("¥"+datasBean.getPrice() ); holder.adv.setNumber(datasBean.getNum());// holder.tv_num.setText(datasBean.getNum() + ""); String images = datasBean.getImages().trim(); String[] split = images.split("[|]"); holder.draweeView.setImageURI(split[0]);// Glide.with(context).load(split[0]).into(holder.draweeView); //二级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.iv_add.setOnClickListener(new View.OnClickListener() {// @Override// public void onClick(View v) {// int num = datasBean.getNum();// holder.tv_num.setText(++num + "");// datasBean.setNum(num);// if (holder.cbChild.isChecked()) {// EventBus.getDefault().post(compute());// }// }// });// //减号// holder.iv_del.setOnClickListener(new View.OnClickListener() {// @Override// public void onClick(View v) {// int num = datasBean.getNum();// if (num == 1) {// Toast.makeText(context,"最小数量为1",Toast.LENGTH_SHORT).show();// return;// }// holder.tv_num.setText(--num + "");// datasBean.setNum(num);// 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) { dialog.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(); }}public class MainActivity extends AppCompatActivity implements IView{ private String uid = "3027"; 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 protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); if (presenter != null) { presenter.detachView(); } } @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) { } @Override 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); }}
在values文件夹下创建attrs<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>
activity_main<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="com.example.gouwuche.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<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center" xmlns:fresco="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto" 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" /> <!--<ImageView--> <!--android:id="@+id/img_icon"--> <!--android:layout_width="80dp"--> <!--android:layout_height="80dp"--> <!--android:src="@mipmap/ic_launcher" />--> <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"> <!--<ImageView--> <!--android:id="@+id/iv_del"--> <!--android:layout_width="25dp"--> <!--android:layout_height="25dp"--> <!--android:src="@mipmap/remove" />--> <!--<TextView--> <!--android:id="@+id/tv_num"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:layout_marginLeft="5dp"--> <!--android:paddingBottom="2dp"--> <!--android:paddingLeft="20dp"--> <!--android:paddingRight="20dp"--> <!--android:paddingTop="2dp"--> <!--android:text="1"--> <!--android:textSize="20sp" />--> <!--<ImageView--> <!--android:id="@+id/iv_add"--> <!--android:layout_width="25dp"--> <!--android:layout_height="25dp"--> <!--android:layout_marginLeft="5dp"--> <!--android:src="@mipmap/add" />--> <com.example.gouwuche.view.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="+"></com.example.gouwuche.view.AddDeleteView> </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<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" /> <!--<Button--> <!--android:id="@+id/tv_store_edtor"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:layout_alignParentRight="true"--> <!--android:layout_centerVertical="true"--> <!--android:layout_marginRight="4dp"--> <!--android:background="@null"--> <!--android:text="编辑"--> <!--android:textSize="18sp"--> <!--/>--> </RelativeLayout></LinearLayout>
layout_add_delete<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>
阅读全文
0 0
- 使用RXjava+Retrofit+MVP实现仿京东购物车
- RxJava+Retrofit+Mvp实现购物车
- Rxjava+Retrofit+MVP实现购物车Mode
- 购物车 ( Retrofit+RxJava+MVP)
- RxJava+Retrofit+Mvp 购物车
- 使用MVP+Retrofit+RXJava实现仿京东分类
- MVP+Retrofit+RxJava 使用
- MVP+Retrofit实现二级购物车
- Retrofit&RxJava购物车
- Rxjava+Retrofit+okhttp+mvp实现
- MVP+Retrofit+RxJava实现分类
- MVP+Retrofit+RxJava组合使用
- MVP+Rxjava+Retrofit的使用
- Retrofit+RxJava+MVP模式使用
- 使用rxjava,retrofit,okhttp实现mvp模式的数据解析
- 购物车+MVP+retrofit请求
- 使用MVP+Retrofit+RxJava实现的的Android Demo (上)使用Nuclues库实现MVP
- Retrofit和Rxjava配合使用加载购物车
- 让DIV中的DIV居中显示
- 右键的 在 vs 中打开 怎么去掉
- *** Your GCC is older than 6.0 and is not supported ubuntu update gcc-6.1
- JAVA之SLFJ报错Failed to load class "org.slf4j.impl.StaticLoggerBinder".-yellowcong
- java进阶-常用数据结构以及算法思想
- 使用RXjava+Retrofit+MVP实现仿京东购物车
- 包裹着img的标签大小固定,img不固定大小时的图片垂直居中
- 使用sql语句导出oracle数据结构信息
- 关于linux中phpstudy安装redis和扩展
- 【R语言学习】R-Studio 快捷键+入门常见操作
- Java中获取键盘输入值的三种方法
- 资源分配图化简法
- 洛谷1195口袋的天空
- Linux cpuidle framework(1)_概述和软件架构