//依賴
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());
}
}