//依赖
compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.google.code.gson:gson:2.8.2' compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'//activity_main
<?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"> <android.support.v7.widget.RecyclerView android:id="@+id/third_recyclerview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <LinearLayout android:layout_weight="0" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#FFFFFF" android:gravity="center_vertical" android:id="@+id/third_pay_linear" > <CheckBox android:id="@+id/third_allselect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/margin_10dp" android:drawableLeft="@drawable/shopcart_selected" android:text="全选" android:drawablePadding="@dimen/padding_5dp" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <TextView android:id="@+id/third_totalprice" android:layout_width="200dp" android:layout_height="wrap_content" android:paddingLeft="@dimen/padding_10dp" android:paddingTop="@dimen/padding_10dp" android:text="总价:" android:textColor="@color/cblack" android:textSize="@dimen/common_font_size_16" /> <TextView android:textColor="@color/cblack" android:id="@+id/third_totalnum" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="@dimen/padding_10dp" android:text="共0件商品" android:textSize="@dimen/common_font_size_14" android:paddingBottom="@dimen/padding_10dp" /> </LinearLayout> <TextView android:id="@+id/third_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/login_btn" android:text="去结算" android:paddingLeft="@dimen/margin_30dp" android:paddingRight="@dimen/margin_30dp" android:paddingTop="@dimen/padding_10dp" android:paddingBottom="@dimen/padding_10dp" android:textColor="#000000" android:layout_marginRight="@dimen/margin_10dp" /> </LinearLayout> </LinearLayout> //adapter_layout<?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="wrap_content" android:background="@color/cwhite"> <LinearLayout android:id="@+id/ll_shopcart_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <View android:layout_width="match_parent" android:layout_height="@dimen/margin_10dp" android:background="@color/background_color" android:id="@+id/view"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" > <!-- 商店checkbox --> <CheckBox android:id="@+id/shop_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/shopcart_selected" android:paddingLeft="@dimen/margin_15dp" android:paddingRight="@dimen/margin_15dp" android:paddingTop="@dimen/margin_10dp" android:paddingBottom="@dimen/margin_10dp" /> <!-- 商店明晨 --> <TextView android:textColor="@color/cblack" android:id="@+id/tv_item_shopcart_shopname" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableLeft="@drawable/shopcart_shop" android:text="宝儿家服装" android:padding="@dimen/padding_10dp" android:drawablePadding="@dimen/padding_5dp" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <View android:layout_width="match_parent" android:layout_height="@dimen/margin_1dp" android:background="@color/background_color" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" > <!-- 商品 checkbox --> <CheckBox android:id="@+id/item_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/shopcart_selected" android:padding="@dimen/margin_15dp" /> <!-- 商品图片 --> <ImageView android:id="@+id/item_pic" android:layout_width="60dp" android:layout_height="60dp" android:layout_margin="@dimen/margin_10dp" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <TextView android:id="@+id/item_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="¥185" android:textColor="@color/main_red_text" android:textSize="@dimen/common_font_size_14" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/margin_5dp" android:layout_marginBottom="@dimen/margin_5dp" > <TextView android:textColor="@color/cblack" android:id="@+id/item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="颜色:黑色" android:textSize="@dimen/common_font_size_12" /> <TextView android:textColor="@color/cblack" android:id="@+id/tv_item_shopcart_cloth_size" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="尺寸:XL" android:textSize="@dimen/common_font_size_12" android:layout_marginLeft="@dimen/margin_10dp" /> </LinearLayout> <test.lj.com.mvpshopdemo.PlusView android:layout_width="100dp" android:layout_height="wrap_content" android:id="@+id/plus_view_id"/> </LinearLayout> <View android:layout_width="@dimen/margin_1dp" android:layout_height="match_parent" android:layout_marginTop="@dimen/padding_10dp" android:layout_marginBottom="@dimen/padding_10dp" android:background="@color/splitline_color" /> <ImageView android:id="@+id/item_del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/margin_20dp" android:src="@drawable/shopcart_delete" /> </LinearLayout> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="@dimen/margin_1dp" android:background="@color/background_color" /> </LinearLayout>
//自定义view布局plus_layout<?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"> <Button android:layout_width="10dp" android:layout_height="wrap_content" android:id="@+id/revserse" android:text="-" android:background="#00FFFFFF"/> <EditText android:inputType="number" android:text="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/content"/> <Button android:background="#00FFFFFF" android:text="+" android:id="@+id/add" android:layout_width="10dp" android:layout_height="wrap_content" /> </LinearLayout>//Drawable下login_btn<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="@dimen/height_200dp"></corners> <solid android:color="@color/pressed_icon_color"></solid> </shape>//values-colors<color name="title_bg">#FDE23D</color> <color name="tab_bg">#FFFFFF</color> <color name="tab_normal_textcolor">#373737</color> <color name="tab_selected_textcolor">#FDE23D</color> <color name="coffer">#442509</color> <color name="pressed_icon_color">#e53e42</color> <color name="background_color">#f6f6f6</color> <color name="main_red_text">#e53e42</color> <dimen name="padding_20dp">20dp</dimen> <color name="splitline_color">#dddddd</color> <color name="cblack">#000000</color>//dimen<dimen name="margin_10dp">10dp</dimen> <dimen name="padding_5dp">5dp</dimen> <dimen name="padding_10dp">10dp</dimen> <dimen name="common_font_size_16">16sp</dimen> <dimen name="common_font_size_14">14sp</dimen> <dimen name="height_200dp">200dp</dimen> <dimen name="margin_30dp">30dp</dimen> <dimen name="margin_15dp">15dp</dimen> <dimen name="margin_1dp">1dp</dimen> <dimen name="margin_5dp">5dp</dimen> <dimen name="common_font_size_12">12sp</dimen> <dimen name="padding_2dp">2dp</dimen> <dimen name="margin_20dp">20dp</dimen>//okhttp封装类http://blog.csdn.net/qq_39969337/article/details/78606656//model层public interface ModelCallBack { public void success(ShopBean bean); public void failure(Exception e); }public class ShopModel { public void getData(final ModelCallBack callBack){ OkhttpUtils.getInstance().asy(null, "http://120.27.23.105/product/getCarts?uid=100", new AbstractUiCallBack<ShopBean>() { @Override public void success(ShopBean bean) { callBack.success(bean); } @Override public void failure(Exception e) { callBack.failure(e); } }); } }//VIEW层public interface ShopView { public void success(ShopBean bean); public void failure(Exception e); }//p层public class ShopPresenter { private ShopView listener; private ShopModel mainModel; public ShopPresenter(ShopView listener) { this.listener = listener; this.mainModel=new ShopModel(); } public void getData(){ mainModel.getData(new ModelCallBack() { @Override public void success(ShopBean bean) { if (listener!=null){ listener.success(bean); } } @Override public void failure(Exception e) { if (listener!=null){ listener.failure(e); } } }); } /** * 防止内存泄漏 */ public void detach(){ listener = null; } }//自定义pulsviewpublic class PlusView extends LinearLayout { private Button revserse,add; private EditText editText; private int mCount=1; public PlusView(Context context) { super(context); } public PlusView(Context context, AttributeSet attrs) { super(context, attrs); View view= LayoutInflater.from(context).inflate(R.layout.plus_layout,null,false); revserse= view.findViewById(R.id.revserse); add= view.findViewById(R.id.add); editText= view.findViewById(R.id.content); revserse.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String content= editText.getText().toString().trim(); int count= Integer.valueOf(content); if (count>1){ mCount=count-1; editText.setText(mCount+""); if (listener!=null){ listener.click(mCount); } } } }); add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String content= editText.getText().toString().trim(); int count=Integer.valueOf(content)+1; mCount=count; editText.setText(count+""); if(listener != null){ listener.click(count); } } }); editText.addTextChangedListener(new TextWatcher() { @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) { } }); //展示 addView(view); } public PlusView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setEditText(int num){ if(editText != null){ editText.setText(num+""); } } public ClickListener listener; public void setListener(ClickListener listener){ this.listener=listener; } /** * 加减号 点击事件 */ public interface ClickListener{ public void click(int count); } }//adapterprivate int IsFirst; private boolean isShopSelected; private boolean isItemSelected;//三个参数,生成getsetpublic class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.IViewHolder> { private Context context; private List<ShopBean.DataBean.ListBean> list; // 存放 商家的id 和 商家名称 private Map<String,String> map = new HashMap<>(); public ShopAdapter(Context context) { this.context = context; } public void add(ShopBean bean){ if (this.list==null){ this.list=new ArrayList<>(); } for (ShopBean.DataBean shop:bean.getData()){ //把商店的id、nama添加到map集合 map.put(shop.getSellerid(),shop.getSellerName()); for (int i=0;i<shop.getList().size();i++){ this.list.add(shop.getList().get(i)); } } setFirst(this.list); notifyDataSetChanged(); } /** * 设置数据源, 控制显示商家 * @param list */ private void setFirst(List<ShopBean.DataBean.ListBean> list){ if (list.size()>0){ list.get(0).setIsFirst(1); for (int i=1;i<list.size();i++){ if (list.get(i).getSellerid()==list.get(i-1).getSellerid()){ list.get(i).setIsFirst(2); }else { list.get(i).setIsFirst(1); if(list.get(i).isItemSelected()){ list.get(i).setShopSelected(list.get(i).isItemSelected()); } } } } } @Override public ShopAdapter.IViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.adapter_layout, null); return new IViewHolder(view); } @Override public void onBindViewHolder(final ShopAdapter.IViewHolder holder, final int position) { if (list.get(position).getIsFirst()==1){ //显示商家 holder.shopCheckbox.setVisibility(View.VISIBLE); holder.tvItemShopcartShopname.setVisibility(View.VISIBLE); holder.shopCheckbox.setChecked(list.get(position).isShopSelected()); // 显示商家的名称 //list.get(position).getSellerid() 取到商家的id // map.get()取到 商家的名称 holder.tvItemShopcartShopname.setText(map.get(String.valueOf(list.get(position).getSellerid()))); }else { holder.shopCheckbox.setVisibility(View.GONE); holder.tvItemShopcartShopname.setVisibility(View.GONE); } //控制 商品的 checkbox holder.itemCheckbox.setChecked(list.get(position).isItemSelected()); //图片url拆分 String [] url=list.get(position).getImages().split("\\|"); ImageLoader.getInstance().displayImage(url[0],holder.itemPic); holder.itemName.setText(list.get(position).getTitle()); holder.itemPrice.setText("¥"+list.get(position).getPrice()); holder.plusViewId.setEditText(list.get(position).getNum()); // 商家的checkbox holder.shopCheckbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //获得商店的CheckBox状态 list.get(position).setShopSelected(holder.shopCheckbox.isChecked()); //遍历商品的 for (int i=0;i<list.size();i++){ //如果商店的getSellerid和商品的getSellerid相同就让商品的CheckBox为选中 if (list.get(position).getSellerid()==list.get(i).getSellerid()) { list.get(i).setItemSelected(holder.shopCheckbox.isChecked()); } } notifyDataSetChanged(); sum(list); } }); //商品的CheckBox holder.itemCheckbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { list.get(position).setItemSelected(holder.itemCheckbox.isChecked()); for (int i=0;i<list.size();i++){ for (int j=0;j<list.size();j++){ if (list.get(i).getSellerid()==list.get(j).getSellerid()&&!list.get(j).isItemSelected()){ list.get(i).setShopSelected(false); break; }else { list.get(i).setShopSelected(true); } } } notifyDataSetChanged(); sum(list); } }); //删除 holder.itemDel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { list.remove(position); setFirst(list); notifyDataSetChanged(); sum(list); } }); //加减 holder.plusViewId.setListener(new PlusView.ClickListener() { @Override public void click(int count) { list.get(position).setNum(count); notifyDataSetChanged(); sum(list); } }); } //全选 public void selectAll(boolean check){ for (int i=0;i<list.size();i++){ list.get(i).setShopSelected(check); list.get(i).setItemSelected(check); } notifyDataSetChanged(); sum(list); } /** * 计算总价 * @param list */ private void sum(List<ShopBean.DataBean.ListBean> list){ int totalNum = 0 ; float totalMoney = 0.0f; boolean allCheck=true; for (int i=0;i<list.size();i++){ if (list.get(i).isItemSelected()){ totalNum+=list.get(i).getNum(); totalMoney+=list.get(i).getNum()*list.get(i).getPrice(); }else { allCheck=false; } } listener.setTotal(totalMoney+"",totalNum+"",allCheck); } @Override public int getItemCount() { return list==null?0:list.size(); } static class IViewHolder extends RecyclerView.ViewHolder{ @BindView(R.id.view) View view; @BindView(R.id.shop_checkbox) CheckBox shopCheckbox; @BindView(R.id.tv_item_shopcart_shopname) TextView tvItemShopcartShopname; @BindView(R.id.ll_shopcart_header) LinearLayout llShopcartHeader; @BindView(R.id.item_checkbox) CheckBox itemCheckbox; @BindView(R.id.item_pic) ImageView itemPic; @BindView(R.id.item_price) TextView itemPrice; @BindView(R.id.item_name) TextView itemName; @BindView(R.id.tv_item_shopcart_cloth_size) TextView tvItemShopcartClothSize; @BindView(R.id.plus_view_id) PlusView plusViewId; @BindView(R.id.item_del) ImageView itemDel; IViewHolder(View view) { super(view); ButterKnife.bind(this, view); } } public UpdateUiListener listener; public void setListener(UpdateUiListener listener){ this.listener = listener; } interface UpdateUiListener { public void setTotal(String total,String num,boolean allCheck); } }//MainActivitypublic class MainActivity extends Activity implements ShopView { @BindView(R.id.third_recyclerview) RecyclerView thirdRecyclerview; @BindView(R.id.third_allselect) CheckBox checkBoxAll; @BindView(R.id.third_totalprice) TextView thirdTotalprice; @BindView(R.id.third_totalnum) TextView thirdTotalnum; @BindView(R.id.third_submit) TextView thirdSubmit; @BindView(R.id.third_pay_linear) LinearLayout thirdPayLinear; private ShopPresenter presenter; private ShopAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); presenter = new ShopPresenter(this); presenter.getData(); adapter = new ShopAdapter(this); LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); thirdRecyclerview.setLayoutManager(manager); thirdRecyclerview.setAdapter(adapter); //回调让总价和件数显示在页面 adapter.setListener(new ShopAdapter.UpdateUiListener() { @Override public void setTotal(String total, String num, boolean allCheck) { checkBoxAll.setChecked(allCheck); thirdTotalnum.setText(num); thirdTotalprice.setText(total); } }); } @Override public void success(ShopBean bean) { adapter.add(bean); } @Override public void failure(Exception e) { Toast.makeText(this, "error", Toast.LENGTH_SHORT).show(); } //销毁 @Override protected void onDestroy() { super.onDestroy(); presenter.detach(); } //全选 @OnClick(R.id.third_allselect) public void onViewClicked() { adapter.selectAll(checkBoxAll.isChecked()); } }