天天看點

MVP二級購物車

//依賴

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;
    }


}      
//自定義pulsview
public 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);
   }



}      
//adapter       
private  int IsFirst;
private  boolean isShopSelected;
private  boolean isItemSelected;      
//三個參數,生成getset      
public 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);
    }

}      
//MainActivity      
public 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());
    }


}