最近項目需要實作類似淘寶購物車的功能,仿了一個,直接上代碼:
public class MainActivity extends Activity implements OnCartListener, View.OnClickListener {
private static final boolean DEBUG = true;
private static final String TAG = MainActivity.class.getSimpleName();
private ExpandableListView mCartExpandableListView;
private TextView mAllCostView;
private TextView mSettlementButton;
private CheckBox mAllCheckView;
private CartAdapter mCartAdapter;
private ArrayList<CartEntity> mCartEntityList = new ArrayList<CartEntity>();
private boolean isAllCheck;
private void initView() {
mAllCostView = (TextView) findViewById(R.id.all_cost);
mSettlementButton = (TextView) findViewById(R.id.settlement);
mCartExpandableListView = (ExpandableListView) findViewById(R.id.expandableListView);
mAllCheckView = (CheckBox) findViewById(R.id.all_check);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setUpCart();
mAllCheckView.setOnClickListener(this);
mSettlementButton.setOnClickListener(this);
}
private void setUpCart() {
mCartAdapter = new CartAdapter(this, mCartEntityList);
mCartExpandableListView.setAdapter(mCartAdapter);
mCartAdapter.setOnCartListener(this);
mCartEntityList.addAll(getData());
mCartAdapter.notifyDataSetChanged();
for (int i = ; i < mCartEntityList.size(); i++) {
mCartExpandableListView.expandGroup(i);
}
}
private ArrayList<CartEntity> getData() {
ArrayList<CartEntity> cartEntityList = new ArrayList<CartEntity>();
for (int i = ; i < ; i++) {
CartEntity cartEntity = new CartEntity();
ArrayList<ProductEntity> productEntityList = new ArrayList<ProductEntity>();
for (int j = ; j < Math.random() * + ; j++) {
ProductEntity productEntity = new ProductEntity();
productEntity.setProductPrice((float) (Math.random() * ));
productEntity.setProductCount();
productEntityList.add(productEntity);
}
cartEntity.setProductEntityList(productEntityList);
cartEntityList.add(cartEntity);
}
return cartEntityList;
}
private void setCheckGroup(int groupPosition, boolean check) {
int len = mCartEntityList.get(groupPosition).getProductEntityList().size();
mCartEntityList.get(groupPosition).setGroupCheck(check);
for (int i = ; i < len; i++) {
mCartEntityList.get(groupPosition).getProductEntityList().get(i).setChildCheck(check);
}
}
private void setCheckChild(int groupPosition, int childPosition, boolean check) {
mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).setChildCheck(check);
int len = mCartEntityList.get(groupPosition).getProductEntityList().size();
boolean groupCheck = true;
for (int i = ; i < len; i++) {
if (!mCartEntityList.get(groupPosition).getProductEntityList().get(i).isChildCheck()) {
groupCheck = false;
}
}
mCartEntityList.get(groupPosition).setGroupCheck(groupCheck);
}
private void handleAllCost() {
float allCost = f;
int allCount = ;
int groupLen = mCartEntityList.size();
for (int i = ; i < groupLen; i++) {
int childLen = mCartEntityList.get(i).getProductEntityList().size();
for (int j = ; j < childLen; j++) {
if (mCartEntityList.get(i).getProductEntityList().get(j).isChildCheck()) {
allCost += mCartEntityList.get(i).getProductEntityList().get(j).getProductPrice() * mCartEntityList.get(i).getProductEntityList().get(j).getProductCount();
allCount++;
}
}
}
mAllCostView.setText("¥" + String.format("%.2f", allCost));
mSettlementButton.setText("結算(" + allCount + ")");
}
private void deleteProduct(int groupPosition, int childPosition) {
mCartEntityList.get(groupPosition).getProductEntityList().remove(childPosition);
if (mCartEntityList.get(groupPosition).getProductEntityList().isEmpty()) {
mCartEntityList.remove(groupPosition);
}
}
@Override
public void groupCheck(int groupPosition) {
log("---groupCheck()---" + "groupPosition:" + groupPosition);
setCheckGroup(groupPosition, !mCartEntityList.get(groupPosition).isGroupCheck());
handleAllCost();
mCartAdapter.notifyDataSetChanged();
}
@Override
public void groupClick() {
log("---groupClick()---");
mCartAdapter.notifyDataSetChanged();
}
@Override
public void groupEdit(int groupPosition) {
log("---groupEdit()---");
mCartEntityList.get(groupPosition).setGroupEdit(!mCartEntityList.get(groupPosition).isGroupEdit());
mCartAdapter.notifyDataSetChanged();
}
@Override
public void childCheck(int groupPosition, int childPosition) {
log("---childCheck()---" + "groupPosition:" + groupPosition + ",childPosition:" + childPosition);
setCheckChild(groupPosition, childPosition, !mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).isChildCheck());
handleAllCost();
mCartAdapter.notifyDataSetChanged();
}
@Override
public void childDelete(int groupPosition, int childPosition) {
log("---childDelete()---" + "groupPosition:" + groupPosition + ",childPosition:" + childPosition);
deleteProduct(groupPosition, childPosition);
handleAllCost();
mCartAdapter.notifyDataSetChanged();
}
@Override
public void childIncrease(int groupPosition, int childPosition) {
log("---childIncrease()---");
mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).setProductCount
(mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).getProductCount() + );
mCartAdapter.notifyDataSetChanged();
}
@Override
public void childReduce(int groupPosition, int childPosition) {
log("---childReduce()---");
if(mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).getProductCount() <= ) return;
mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).setProductCount
(mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).getProductCount() - );
mCartAdapter.notifyDataSetChanged();
}
@Override
public void childClick() {
log("---childClick()---");
mCartAdapter.notifyDataSetChanged();
}
@Override
public void childEdit() {
log("---childEdit()---");
mCartAdapter.notifyDataSetChanged();
}
private void log(String message) {
if (DEBUG) {
Log.d(TAG, message);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.all_check:
isAllCheck = !isAllCheck;
setAllCheck(isAllCheck);
break;
case R.id.settlement:
if (!verifyCart()) {
Toast.makeText(MainActivity.this, R.string.select_tip, Toast.LENGTH_SHORT).show();
}
break;
}
}
private void setAllCheck(boolean check) {
int groupLen = mCartEntityList.size();
for (int i = ; i < groupLen; i++) {
setCheckGroup(i, check);
}
handleAllCost();
mCartAdapter.notifyDataSetChanged();
}
private boolean verifyCart() {
int groupLen = mCartEntityList.size();
boolean flag = false;
for (int i = ; i < groupLen; i++) {
int childLen = mCartEntityList.get(i).getProductEntityList().size();
for (int j = ; j < childLen; j++) {
if (mCartEntityList.get(i).getProductEntityList().get(j).isChildCheck()) {
flag = true;
}
}
}
return flag;
}
}
public interface OnCartListener {
public void groupCheck(int groupPosition);
public void groupClick();
public void groupEdit(int groupPosition);
public void childCheck(int groupPosition,int childPosition);
public void childDelete(int groupPosition,int childPosition);
public void childIncrease(int groupPosition,int childPosition);
public void childReduce(int groupPosition,int childPosition);
public void childClick();
public void childEdit();
}
擴充卡:
public class CartAdapter extends BaseExpandableListAdapter implements View.OnClickListener{
private Context context;
private ArrayList<CartEntity> mCartEntityList;
public CartAdapter(Context context,ArrayList<CartEntity> cartEntitiyList){
this.context = context;
mCartEntityList = cartEntitiyList;
}
private OnCartListener mCartListener;
public void setOnCartListener(OnCartListener cartListener){
mCartListener = cartListener;
}
@Override
public int getGroupCount() {
return mCartEntityList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return mCartEntityList.get(groupPosition).getProductEntityList().size();
}
@Override
public Object getGroup(int groupPosition) {
return mCartEntityList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupViewHolder = null;
if(null == convertView){
groupViewHolder = new GroupViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_cart_group,parent,false);
groupViewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.group_checkBox);
groupViewHolder.shopName = (TextView) convertView.findViewById(R.id.shop_name);
groupViewHolder.shopIcon = (ImageView) convertView.findViewById(R.id.shop_icon);
groupViewHolder.shoplayout = convertView.findViewById(R.id.shop_layout);
groupViewHolder.groupEdit = (TextView) convertView.findViewById(R.id.group_edit);
groupViewHolder.groupDividerView = convertView.findViewById(R.id.divider_group);
convertView.setTag(groupViewHolder);
}else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
if( == groupPosition){
groupViewHolder.groupDividerView.setVisibility(View.GONE);
}else {
groupViewHolder.groupDividerView.setVisibility(View.VISIBLE);
}
groupViewHolder.checkBox.setChecked(mCartEntityList.get(groupPosition).isGroupCheck());
if(mCartEntityList.get(groupPosition).isGroupEdit()){
groupViewHolder.groupEdit.setText(R.string.complete);
}else {
groupViewHolder.groupEdit.setText(R.string.edit);
}
groupViewHolder.checkBox.setTag(R.integer.view_group_tag, groupPosition);
groupViewHolder.groupEdit.setTag(R.integer.view_group_tag, groupPosition);
groupViewHolder.checkBox.setOnClickListener(this);
groupViewHolder.shoplayout.setOnClickListener(this);
groupViewHolder.groupEdit.setOnClickListener(this);
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder childViewHolder = null;
if(null == convertView){
childViewHolder = new ChildViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_cart_child,parent,false);
childViewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.child_checkBox);
childViewHolder.productName = (TextView) convertView.findViewById(R.id.product_name);
childViewHolder.productIcon = (ImageView) convertView.findViewById(R.id.product_icon);
childViewHolder.productCount = (TextView) convertView.findViewById(R.id.product_count);
childViewHolder.productPrice = (TextView) convertView.findViewById(R.id.product_price);
childViewHolder.productInfo = (TextView) convertView.findViewById(R.id.product_info);
childViewHolder.childDeleteButton = (TextView) convertView.findViewById(R.id.child_delete);
childViewHolder.viewEdit = convertView.findViewById(R.id.layout_edit);
childViewHolder.viewComplete = convertView.findViewById(R.id.layout_complete);
childViewHolder.increaseBtn = (ImageView) convertView.findViewById(R.id.btn_increase);
childViewHolder.reduceBtn = (ImageView) convertView.findViewById(R.id.btn_reduce);
childViewHolder.editProdcutCount = (TextView) convertView.findViewById(R.id.edit_product_count);
convertView.setTag(childViewHolder);
}else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
if(mCartEntityList.get(groupPosition).isGroupEdit()){
childViewHolder.viewEdit.setVisibility(View.VISIBLE);
childViewHolder.viewComplete.setVisibility(View.INVISIBLE);
}else {
childViewHolder.viewEdit.setVisibility(View.INVISIBLE);
childViewHolder.viewComplete.setVisibility(View.VISIBLE);
}
childViewHolder.checkBox.setChecked(mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).isChildCheck());
childViewHolder.productPrice.setText("¥" + String.format("%.2f", mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).getProductPrice()));
childViewHolder.editProdcutCount.setText(mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).getProductCount()+"");
childViewHolder.productCount.setText("x"+mCartEntityList.get(groupPosition).getProductEntityList().get(childPosition).getProductCount());
childViewHolder.checkBox.setTag(R.integer.view_group_tag, groupPosition);
childViewHolder.checkBox.setTag(R.integer.view_child_tag, childPosition);
childViewHolder.checkBox.setOnClickListener(this);
childViewHolder.childDeleteButton.setTag(R.integer.view_group_tag, groupPosition);
childViewHolder.childDeleteButton.setTag(R.integer.view_child_tag, childPosition);
childViewHolder.childDeleteButton.setOnClickListener(this);
childViewHolder.increaseBtn.setTag(R.integer.view_group_tag, groupPosition);
childViewHolder.increaseBtn.setTag(R.integer.view_child_tag, childPosition);
childViewHolder.increaseBtn.setOnClickListener(this);
childViewHolder.reduceBtn.setTag(R.integer.view_group_tag, groupPosition);
childViewHolder.reduceBtn.setTag(R.integer.view_child_tag, childPosition);
childViewHolder.reduceBtn.setOnClickListener(this);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
@Override
public void onClick(View v) {
if(null == mCartListener) return;
switch (v.getId()){
case R.id.group_checkBox:
mCartListener.groupCheck((int) v.getTag(R.integer.view_group_tag));
break;
case R.id.child_checkBox:
mCartListener.childCheck((int) v.getTag(R.integer.view_group_tag), (int) v.getTag(R.integer.view_child_tag));
break;
case R.id.shop_layout:
mCartListener.groupClick();
break;
case R.id.group_edit:
mCartListener.groupEdit((int) v.getTag(R.integer.view_group_tag));
break;
case R.id.child_delete:
mCartListener.childDelete((int)v.getTag(R.integer.view_group_tag),(int)v.getTag(R.integer.view_child_tag));
break;
case R.id.btn_increase:
mCartListener.childIncrease((int)v.getTag(R.integer.view_group_tag),(int)v.getTag(R.integer.view_child_tag));
break;
case R.id.btn_reduce:
mCartListener.childReduce((int) v.getTag(R.integer.view_group_tag), (int) v.getTag(R.integer.view_child_tag));
break;
}
}
private static class GroupViewHolder{
CheckBox checkBox;
ImageView shopIcon;
TextView shopName;
TextView groupEdit;
View shoplayout;
View groupDividerView;
}
private static class ChildViewHolder{
CheckBox checkBox;
ImageView productIcon;
TextView productName;
TextView productInfo;
TextView productPrice;
TextView productCount;
TextView childDeleteButton;
View viewEdit;
View viewComplete;
ImageView increaseBtn;
ImageView reduceBtn;
TextView editProdcutCount;
}
}
下載下傳位址:https://github.com/piratecode/TaoBaoCart