移動端購物車邏輯之介面回撥
阿新 • • 發佈:2019-02-11
不說話,先上圖:
專案中經常需要實現這樣的邏輯:
點選全選按鈕,實時顯示物料種類數和總數;
點選加減按鈕,總數實時增減;
再次點選全選按鈕,全部不選。
主要的難點在於介面回撥的使用,上程式碼:
activity程式碼:
package com.example.michael.cartdemo.activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import com.example.michael.cartdemo.adapter.CartAdapter; import com.example.michael.cartdemo.R; import com.example.michael.cartdemo.bean.ItemBean; import com.example.michael.cartdemo.interf.CheckInterface; import com.example.michael.cartdemo.interf.ModifyCountInterface; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener,CheckInterface,ModifyCountInterface{ private ListView lvCart; private CheckBox cbChooseAll; private TextView tvMaterialNum; private TextView tvAllNum; private int totalCount; private int totalNum; private List<ItemBean> infos = new ArrayList<>(); private CartAdapter cartAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { initView(); initData(); initAdapter(); initListener(); } private void initListener() { cbChooseAll.setOnClickListener(this); } private void initAdapter() { cartAdapter = new CartAdapter(infos); cartAdapter.setCheckInterface(this); cartAdapter.setModifyCountInterface(this); lvCart.setAdapter(cartAdapter); } private void initData() { for (int i = 0; i < 3; i++) { ItemBean itemBean = new ItemBean(); itemBean.setInvName("家電傢俱大資料跨境電商大資料技術監督局環境多說幾句方式見附件1電視電話環境"); itemBean.setInvCode("1999266555"); itemBean.setNum(9); itemBean.setSpecification("(4*25)"); infos.add(itemBean); } } private void initView() { lvCart = (ListView) findViewById(R.id.lv_cart); cbChooseAll = (CheckBox) findViewById(R.id.cb_choose_all); tvMaterialNum = (TextView) findViewById(R.id.tv_material_num); tvAllNum = (TextView) findViewById(R.id.tv_all_num); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.cb_choose_all: if(infos.size() != 0){ if(cbChooseAll.isChecked()){ for (int i = 0; i < infos.size(); i++) { infos.get(i).setChecked(true); } cartAdapter.notifyDataSetChanged(); }else{ for (int i = 0; i < infos.size(); i++) { infos.get(i).setChecked(false); } cartAdapter.notifyDataSetChanged(); } } statistics(); break; } } private void statistics() { totalCount = 0; totalNum = 0; for (int i = 0; i < infos.size(); i++) { ItemBean itemBean = infos.get(i); if(itemBean.getChecked()){ totalNum++; totalCount += itemBean.getNum(); } } tvMaterialNum.setText(totalNum + ""); tvAllNum.setText(totalCount + ""); } @Override public void checkGroup(int position, boolean isChecked) { infos.get(position).setChecked(isChecked); if(isAllCheck()){ cbChooseAll.setChecked(true); }else{ cbChooseAll.setChecked(false); } cartAdapter.notifyDataSetChanged(); statistics(); } @Override public void doIncrease(int position, View showCountView, boolean isChecked) { ItemBean itemBean = infos.get(position); int currentCount = itemBean.getNum(); currentCount++; itemBean.setNum(currentCount); ((EditText)showCountView).setText(currentCount + ""); cartAdapter.notifyDataSetChanged(); statistics(); } @Override public void doDecrease(int position, View showCountView, boolean isChecked) { ItemBean itemBean = infos.get(position); int currentCount = itemBean.getNum(); if(currentCount == 1){ return; } currentCount--; itemBean.setNum(currentCount); ((EditText)showCountView).setText(currentCount + ""); cartAdapter.notifyDataSetChanged(); statistics(); } public boolean isAllCheck() { for (int i = 0; i < infos.size(); i++) { if(!infos.get(i).getChecked()){ return false; } } return true; } }
adapter程式碼:
package com.example.michael.cartdemo.adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; import com.example.michael.cartdemo.R; import com.example.michael.cartdemo.bean.ItemBean; import com.example.michael.cartdemo.interf.CheckInterface; import com.example.michael.cartdemo.interf.ModifyCountInterface; import java.util.List; /** * Created by Michael on 2017/6/1. */ public class CartAdapter extends BaseAdapter { private CheckInterface checkInterface; private ModifyCountInterface modifyCountInterface; public void setCheckInterface(CheckInterface checkInterface) { this.checkInterface = checkInterface; } public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) { this.modifyCountInterface = modifyCountInterface; } private List<ItemBean> mList; public CartAdapter(List<ItemBean> list) { mList = list; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if(convertView == null){ convertView = LayoutInflater .from(parent.getContext()) .inflate(R.layout.item_cart_adapter,null); holder = new ViewHolder(); holder.tvInvName = (TextView) convertView.findViewById(R.id.tv_inv_name); holder.tvInvCode = (TextView) convertView.findViewById(R.id.tv_inv_code); holder.tvSpecification = (TextView) convertView.findViewById(R.id.tv_specification); holder.etNum = (EditText) convertView.findViewById(R.id.et_num); holder.cbItemCheck = (CheckBox) convertView.findViewById(R.id.cb_item_check); holder.etMinus = (EditText) convertView.findViewById(R.id.et_minus); holder.etAdd = (EditText) convertView.findViewById(R.id.et_add); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.etNum.setText(mList.get(position).getNum() + ""); holder.cbItemCheck.setChecked(mList.get(position).getChecked()); holder.cbItemCheck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mList.get(position).setChecked(((CheckBox)v).isChecked()); checkInterface.checkGroup(position,((CheckBox)v).isChecked()); } }); holder.etMinus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { modifyCountInterface .doDecrease(position,holder.etNum,holder.cbItemCheck.isChecked()); } }); holder.etAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { modifyCountInterface .doIncrease(position,holder.etNum,holder.cbItemCheck.isChecked()); } }); return convertView; } class ViewHolder { public TextView tvInvName; public TextView tvInvCode; public TextView tvSpecification; public EditText etNum; public CheckBox cbItemCheck; public EditText etMinus; public EditText etAdd; } }
bean程式碼:
package com.example.michael.cartdemo.bean; /** * Created by Michael on 2017/6/25. */ public class ItemBean { private String invName; private String invCode; private String specification; private int num; private boolean isChecked; public void setInvName(String invName){ this.invName = invName; } public String getInvName(){ return invName; } public void setInvCode(String invCode){ this.invCode = invCode; } public String getInvCode(){ return invCode; } public void setSpecification(String specification){ this.specification = specification; } public String getSpecification(){ return specification; } public void setNum(int num){ this.num = num; } public int getNum(){ return num; } public void setChecked(boolean isChecked){ this.isChecked = isChecked; } public boolean getChecked(){ return isChecked; } }
介面定義:
package com.example.michael.cartdemo.interf;
/**
* Created by Michael on 2017/6/25.
*/
public interface CheckInterface {
void checkGroup(int position, boolean isChecked);
}
package com.example.michael.cartdemo.interf;
import android.view.View;
/**
* Created by Michael on 2017/6/25.
*/
public interface ModifyCountInterface {
void doIncrease(int position, View showCountView, boolean isChecked);
void doDecrease(int position, View showCountView, boolean isChecked);
}
佈局程式碼:
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_50dp"
android:background="@color/white"
>
<!--<View
android:layout_marginLeft="@dimen/default_margin_45dp"
android:layout_width="@dimen/default_margin_1.5dp"
android:layout_height="@dimen/default_margin_30dp"
android:layout_centerVertical="true"
android:background="@color/color_cccccc"
>
</View>-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="購物車"
android:textSize="@dimen/default_text_size_25sp"
android:textStyle="bold"
/>
<View
android:layout_marginRight="@dimen/default_margin_50dp"
android:layout_alignParentRight="true"
android:layout_width="@dimen/default_margin_1.5dp"
android:layout_height="@dimen/default_margin_30dp"
android:layout_centerVertical="true"
android:background="@color/eeeeee"
>
</View>
<ImageButton
android:id="@+id/ib_del"
android:layout_alignParentRight="true"
android:layout_width="@dimen/default_margin_50dp"
android:layout_height="match_parent"
android:src="@mipmap/delete_menu"
android:scaleType="center"
android:onClick="onPopupClick"
android:background="@null"
/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_1dp"
android:background="@color/color_333333"
>
</View>
<ListView
android:id="@+id/lv_cart"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
</ListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#00000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#03000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#05000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#08000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#0A000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#0D000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#0F000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#12000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#14000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#17000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0.8dp"
android:background="#1A000000"
>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_60dp">
<RelativeLayout
android:layout_width="@dimen/default_margin_50dp"
android:layout_height="match_parent">
<CheckBox
android:id="@+id/cb_choose_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="45dp"
android:layout_width="@dimen/default_margin_40dp"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="全選"
/>
</RelativeLayout>
<View
android:layout_marginLeft="91dp"
android:layout_width="@dimen/default_margin_1dp"
android:layout_height="@dimen/default_margin_40dp"
android:layout_centerVertical="true"
android:background="@color/eeeeee"
>
</View>
<RelativeLayout
android:layout_marginLeft="91dp"
android:layout_width="@dimen/default_margin_50dp"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerInParent="true"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="物料"
/>
<TextView
android:id="@+id/tv_material_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#D90000"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
</RelativeLayout>
<View
android:layout_marginLeft="141dp"
android:layout_width="@dimen/default_margin_1dp"
android:layout_height="@dimen/default_margin_40dp"
android:background="@color/eeeeee"
android:layout_centerVertical="true"
>
</View>
<RelativeLayout
android:layout_marginLeft="141dp"
android:layout_width="@dimen/default_margin_65dp"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="數量"
android:layout_gravity="center_horizontal"
/>
<TextView
android:id="@+id/tv_all_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#D90000"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_balance"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/default_margin_10dp"
android:clickable="true"
android:focusable="true"
android:layout_width="150dp"
android:layout_height="@dimen/default_margin_40dp"
android:background="@drawable/shape_sure"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ok"
android:layout_centerVertical="true"
/>
<TextView
android:layout_marginLeft="@dimen/default_margin_25dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="結算"
android:textSize="@dimen/default_text_size_18sp"
android:layout_centerVertical="true"
android:textColor="@color/white"
/>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="12"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
>
<CheckBox
android:id="@+id/cb_item_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<View
android:layout_width="@dimen/default_margin_1dp"
android:layout_height="match_parent"
android:background="@color/eeeeee"
>
</View>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="10"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_45dp"
android:padding="@dimen/default_margin_5dp"
>
<TextView
android:id="@+id/tv_inv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="end"
android:lines="2"
android:singleLine="false"
android:text="戶都是大家都是科技第三季度技術監督局苦上加苦待機時間副教授積分開始的解放軍傢俱家電司法局是打發時間"
/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_1dp"
android:background="@color/eeeeee"
>
</View>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="120dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="3"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:weightSum="10"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="編"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<View
android:layout_width="@dimen/default_margin_1dp"
android:layout_height="match_parent"
android:background="@color/eeeeee"
>
</View>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="9"
>
<TextView
android:id="@+id/tv_inv_code"
android:layout_marginLeft="@dimen/default_margin_5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="17992"
android:layout_centerVertical="true"
/>
</RelativeLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_1dp"
android:background="@color/eeeeee"
>
</View>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:weightSum="10"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="規"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<View
android:layout_width="@dimen/default_margin_1dp"
android:layout_height="match_parent"
android:background="@color/eeeeee"
>
</View>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="9"
>
<TextView
android:id="@+id/tv_specification"
android:layout_marginLeft="@dimen/default_margin_5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(4*25)"
android:layout_centerVertical="true"
/>
</RelativeLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/default_margin_1dp"
android:background="@color/eeeeee"
>
</View>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:weightSum="10"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="數"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<View
android:layout_width="@dimen/default_margin_1dp"
android:layout_height="match_parent"
android:background="@color/eeeeee"
>
</View>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="9"
>
<LinearLayout
android:layout_marginLeft="@dimen/default_margin_5dp"
android:layout_width="wrap_content"
android:layout_height="@dimen/default_margin_30dp"
android:layout_centerVertical="true"
android:orientation="horizontal"
>
<EditText
android:id="@+id/et_minus"
android:clickable="true"
android:focusable="false"
android:layout_width="@dimen/default_margin_30dp"
android:layout_height="match_parent"
android:editable="false"
android:gravity="center"
android:text="-"
android:background="@drawable/shape_set"
/>
<EditText
android:id="@+id/et_num"
android:layout_width="@dimen/default_margin_45dp"
android:layout_height="match_parent"
android:background="@drawable/shape_set"
android:text="145"
android:textColor="#5394C9"
android:gravity="center"
/>
<EditText
android:id="@+id/et_add"
android:clickable="true"
android:focusable="false"
android:layout_width="@dimen/default_margin_30dp"
android:layout_height="match_parent"
android:editable="false"
android:gravity="center"
android:text="+"
android:background="@drawable/shape_set"
/>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
>
<solid android:color="@android:color/transparent" />
<stroke android:width="@dimen/default_margin_0.5dp"
android:color="@color/plugin_camera_black"
>
</stroke>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:radius="@dimen/default_margin_4dp">
</corners>
<solid android:color="#5394C9">
</solid>
</shape>