8000 GitHub - Oaman/shoppingcart
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Oaman/shoppingcart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

shoppingcart

直接上代码。

1 首先需要一个显示的界面MainActivity;xml文件如下,其中ShoppingCartBottomView是简单自定义的一个底部控件,下面会讲到

<com.oman.shoppingcart.customview.ShoppingCartBottomView android:id="@+id/shoppingcart_bottom" android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentBottom="true"/>

然后MainActivity.ava的代码如下,不要着急有些类没有讲到,后面会详细讲解,淡定。。。

public class MainActivity extends BaseActivity {

protected ShoppingCartBottomView mBottomView;

protected ListView mListView; protected ShoppingCartListAdapter mAdapter; protected ArrayList mData = new ArrayList<>();

@Override protected int getLayoutId() { return R.layout.activity_main; }

@Override protected void initView() { CartCommodityModel model = new CartCommodityModel(); model.setId(1); model.setName("测试商品1"); model.setPrice("100"); model.setOriginalPrice("120"); model.setVipPrice("80"); model.setBuyNum("2"); mData.add(model);

CartCommodityModel model2 = new CartCommodityModel();
model2.setId(1);
model2.setName("测试商品2");
model2.setPrice("200");
model2.setOriginalPrice("220");
model2.setVipPrice("160");
model2.setBuyNum("3");
mData.add(model2);

CartCommodityModel model3 = new CartCommodityModel();
model3.setId(1);
model3.setName("测试商品3");
model3.setPrice("300");
model3.setOriginalPrice("340");
model3.setVipPrice("280");
model3.setBuyNum("4");
mData.add(model3);
mBottomView = (ShoppingCartBottomView) findViewById(R.id.shoppingcart_bottom);
mAdapter = new ShoppingCartListAdapter(this, mData, mBottomView);

mBottomView.setData(mData);
mBottomView.setBinderAdapter(mAdapter);
mListView= (ListView) findViewById(R.id.listview);
mListView.setAdapter(mAdapter);

mBottomView.setOnConfirmListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        startActivity(new Intent(MainActivity.this,PaymentActivity.class));
    }
});

}

}

2 这里面用到了几个类 ShoppingCartBottomView(底部的一些操作按钮) ShoppingCartListAdapter(填充商品的适配器) CartCommodityModel(商品的model)

ShoppingCartViewHolder(这个就不用说了吧。。。你懂的)

在hoppingCartViewHolder中我写了一个接口,用来监听商品的数量变化的接口,当点击加减号的时候就会回调;

addView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (listener != null) { listener.onAmountAddClick(getAdapterPosition()); } } }); minusView.setOnClickListener(new View.OnClickListener() { @Override public vo 67C0 id onClick(View view) { if (listener != null) { listener.onAmountMinusClick(getAdapterPosition()); } } });

}

public interface OnViewClickListener {

void onAmountAddClick(int position);

void onAmountMinusClick(int position);

}

3 当然了,在ShoppingCartListAdapter中需要实现这个接口,那么就要实现他的方法,点击加号或者减号的时候要将商品的数量相应的加减1(当商品的数量是大于等于1的时候 才能减),当点击小计前面的CheckBox按钮时候需要监听中实现该model是否选中该商品,然后更新一下适配器(不过这里我自己重写了一下notifyDataSetChanged()方法,见 下面代码);我还封装了两个抽象类,一个是适配器继承的类TemplateListAdapter,还有一个是Activity继承的类BaseActivity,在项目中挺实用的;

public class ShoppingCartListAdapter extends TemplateListAdapter<CartCommodityModel, ShoppingCartViewHolder> implements ShoppingCartViewHolder.OnViewClickListener {

private DecimalFormat mDecimalFormat = new DecimalFormat("##0.00");

private ShoppingCartBottomView mBottomView;

public ShoppingCartListAdapter(Context context, List data, ShoppingCartBottomView mBottomView) { super(context, data); this.mBottomView = mBottomView; }

@Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); mBottomView.notifyDataSetChanged(); }

@Override public int getLayoutId() { return R.layout.item_shopping_cart; }

@Override public ShoppingCartViewHolder getViewHolder(View convertView) { return new ShoppingCartViewHolder(convertView, this); }

@Override public void bindData(int position, ShoppingCartViewHolder holder) { final CartCommodityModel model = getItem(position); holder.sumPriceView.setText(getSumPrice(model)); holder.checkBox.setChecked(model.isSelected()); holder.amountView.setText(model.getBuyNum()); Picasso.with(mContext).load(R.mipmap.ic_launcher).into(holder.imageView); holder.nameView.setText(model.getName()); holder.priceView.setText(model.getPrice()); holder.originPriceView.setText(model.getOriginalPrice()); holder.vipPriceView.setText(model.getVipPrice()); holder.rootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(mContext, "点击了" + model.getName(), Toast.LENGTH_SHORT).show(); } }); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { model.setSelected(!model.isSelected()); mBottomView.notifyDataSetChanged(); } }); }

private String getSumPrice(CartCommodityModel model) { if (Integer.valueOf(model.getBuyNum()) != 0) { return "小计:" + (Integer.valueOf(model.getBuyNum())) * (Integer.valueOf(model.getPrice())); } else { return "小计:¥0.00"; }

}

@Override public void onAmountAddClick(int position) { CartCommodityModel model = getItem(position); model.setBuyNum(String.valueOf(Integer.valueOf(model.getBuyNum()) + 1)); notifyDataSetChanged(); }

@Override public void onAmountMinusClick(int position) { CartCommodityModel model = getItem(position); if (Integer.valueOf(model.getBuyNum()) > 1) { model.setBuyNum(String.valueOf(Integer.valueOf(model.getBuyNum()) - 1)); notifyDataSetChanged(); } }

}

4 我认为这里面最主要的就属于ShoppingCartBottomView这个类了,下面详细讲解一下

当点击全选按钮时候,需要将每一个model的选中状态和全选按钮一致,然后更新一下各个控件的显示(需要写几个方法用来在notifyDataSetChanged()中调用即可)

当点击去结算按钮时候就会跳转到付款页面

有没有被我的详细讲解惊艳到,哈哈,是不是很简单

public class ShoppingCartBottomView extends LinearLayout {

protected AppCompatCheckBox mCheckBox; protected TextView mSelectedNumberView; protected TextView mSumPriceView; protected TextView mDiscountPriceView;

protected List mData; protected ShoppingCartListAdapter mBinderAdapter;

protected OnClickListener mListener;

private DecimalFormat mDecimalFormat = new DecimalFormat("##0.00");

public ShoppingCartBottomView(Context context) { super(context); initView(); }

public ShoppingCartBottomView(Context context, AttributeSet attrs) { super(context, attrs); initView(); }

public ShoppingCartBottomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); }

public void setData(List data) { mData = data; }

public void setBinderAdapter(ShoppingCartListAdapter adapter) { mBinderAdapter = adapter; }

protected void initView() { View view = View.inflate(getContext(), R.layout.view_shoppingcart_bottom, null); mCheckBox = (AppCompatCheckBox) view.findViewById(R.id.shoppingcart_bottom_checkbox); mSelectedNumberView = (TextView) view.findViewById(R.id.shoppingcart_bottom_selected_number); mSumPriceView = (TextView) view.findViewById(R.id.shoppingcart_bottom_sum_price); mDiscountPriceView = (TextView) view.findViewById(R.id.shoppingcart_bottom_discount_price); mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { for (CartCommodityModel model : mData) { model.setSelected(isChecked); } if (mBinderAdapter != null) { mBinderAdapter.notifyDataSetChanged(); } } }); view.findViewById(R.id.shoppingcart_bottom_confirm).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { mListener.onClick(v); } } }); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); view.setLayoutParams(layoutParams); addView(view); }

@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); }

@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); }

private void updateNumberView(int number) { mSelectedNumberView.setText("(" + number + ")"); }

private void updateSumPriceView(float sumPrice) { mSumPriceView.setText("合计: " + mDecimalFormat.format(sumPrice) + "元"); }

private void updateDiscountView(float discount) { mDiscountPriceView.setText("已优惠: " + mDecimalFormat.format(discount) + "元"); }

public void setOnConfirmListener(OnClickListener listener) { mListener = listener; }

public void notifyDataSetChanged() { if (mData != null) { float sumPrice = 0; float originalPrice = 0; int sumCount = 0; for (CartCommodityModel model : mData) { if (model.isSelected()) { sumPrice += Float.valueOf(model.getPrice()) * Integer.valueOf(model.getBuyNum()); originalPrice += Float.valueOf(model.getOriginalPrice()) * Integer.valueOf(model.getBuyNum()); sumCount += Integer.valueOf(model.getBuyNum()); } } updateNumberView(sumCount); updateSumPriceView(sumPrice); updateDiscountView(originalPrice - sumPrice); } }

}

这样的话这个完整的小购物车项目基本上就结束了

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

0