最近遇到一个项目需要写一个购物车功能,之前也没写过,看别人大多都是利用Handler实现全选、单选、修改数量时即时刷新总价;现在我直接调用方法来实现(其实思路是类似的)。
购物车效果图(由于笔者发帖不多,暂时还不会制作成动图展示):
下图是购物车的需求:
1、首先在Activity中声明一个List保存从服务器请求回来的数据
private List<Shopping> shoppingList = new ArrayList<>();
2、然后在购物车的实体类(Shopping)中加入一个字段“checks”用来记录每一条数据是否选中的状态
private boolean checks;
public boolean isChecks() {
return checks;
}
public void setChecks(boolean checks) {
this.checks = checks;
}
3、既然无论是点击item的CheckBox或加、减按钮,还是点击Activity中的全选,都是Activity中的合计价格发生变化,那么我就在Activity中写一个方法,处理item中的点击事件,在Adapter中调用该方法即可。
/**
* 选中,加减方法
* @param checks 是否被选中
* @param count 被选中的商品id
* @param number 被选中商品的数量
*/
public void UpView(boolean checks, int count,int number){
double AllPrice = 0;
int size = 0 ;//用来计数,判断数据是否被全部选中
for (Shopping shop:shoppingList) {
if(shop.p_id == count){//查找被选中商品id
shop.setChecks(checks);//改变商品集合shoppingList中的选中状态
shop.p_number = number;//同时修改商品数量
}
if(shop.isChecks()){//判断商品是否被选中,如被选中计算价格
size++;
AllPrice =AllPrice + Double.valueOf(shop.p_price) * shop.p_number;//得到被选中商品的总价格
}
}
shopAdapter.clear();
shopAdapter.addItem(shoppingList);
shopAdapter.notifyDataSetChanged();
prices.setText("¥"+AllPrice);//显示总价
if(size == shoppingList.size()){
all_checks.setChecked(true);//是全部被选中,改变全选check状态为选中
}else{
a = 1;//a=1表示all_checks监听中方法不执行
if(!all_checks.isChecked()) a=0;//all_checks未被选中给a赋值0让all_checks的监听中的方法继续执行
all_checks.setChecked(false);//不是,继续维持未选中状态
}
}
4、接下来就是Adapter中调用,调用很简单:
//选中监听
holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mainActivity.UpView(isChecked, shopping.p_id, shopping.p_number);
}
});
//数量减
holder.minus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int minus = 0;//新数量
if(shopping.p_number>1) {
minus = shopping.p_number-1;
mainActivity.UpView(shopping.isChecks(), shopping.p_id, minus);
}else{
Toast.makeText(context,"数量不能再少了",Toast.LENGTH_SHORT).show();
}
}
});
//数量加
holder.add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainActivity.UpView(shopping.isChecks(),shopping.p_id,(shopping.p_number+1));
}
});
5、此时Adapter中的监听已经处理完了,接下来是Activity中全选(CheckBox)的监听:
/**
* 全选check监听
*/
public void AllChecks(){
all_checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(b==0){
a=0;b=1;
}
if(a==0) {//解决单选与全选冲突
if (isChecked) {//true:全选被选中,false:全选取消
double AllPrice = 0;
for (Shopping shop : shoppingList) {
shop.setChecks(true);//改变商品选中状态 AllPrice = AllPrice + Double.valueOf(shop.p_price) * shop.p_number;//计算商品总价
}
prices.setText("¥" + AllPrice);//显示总价
} else {
b=0;
for (Shopping shop : shoppingList) {
shop.setChecks(false);//改变商品未选中状态
}
prices.setText("¥0.0");//价格改为0
}
shopAdapter.clear();
shopAdapter.addItem(shoppingList);//添加改编后的数据到list的Adapter
shopAdapter.notifyDataSetChanged();//刷新列表
}
a=0;
}
});
}
6、至此,购物车的主要功能已经实现,接下来就是结算、删除以及数量不能小于1的判断:
注意:因为结算和删除方法类似,这里只贴结算的代码;
/**
* 结算方法
*/public void Settlement(){
List<Integer> settlement_list = new ArrayList<>();
final List<Shopping> new_list = new ArrayList<>();
for (Shopping shop:shoppingList) {
if(shop.isChecks()){
settlement_list.add(shop.p_id);//取出被选中商品id加入新的list准备掉接口完成结算
}else{
new_list.add(shop);//剩余商品形成新的购物车列表等待显示
}
}
if(settlement_list.size()==0){
Toast.makeText(MainActivity.this,"请选中至少一个商品后在结算",Toast.LENGTH_SHORT).show();
return;
}
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("提示").setMessage("总共"+settlement_list.size()+"个商品,共"+prices.getText().toString()+"元,是否要结算?");
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//在这里调结算接口把settlement_list传给后台
shoppingList = new_list;
shopAdapter.clear();
shopAdapter.addItem(shoppingList);
shopAdapter.notifyDataSetChanged();
prices.setText("¥0.0");
dialog.cancel();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).create().show();
}
详细代码请看:
http://blog.csdn.net/qq_24544019/article/details/53156768
源码下载http://pan.baidu.com/s/1eSkK12a
好了,以上就是笔者实现的购物车功能,欢迎各位读者评论提问,O(∩_∩)O谢谢!