最近遇到一個項目需要寫一個購物車功能匹厘,之前也沒寫過屯蹦,看別人大多都是利用Handler實現(xiàn)全選维哈、單選绳姨、修改數(shù)量時即時刷新總價;現(xiàn)在我直接調(diào)用方法來實現(xiàn)(其實思路是類似的)阔挠。
購物車效果圖(由于筆者發(fā)帖不多飘庄,暫時還不會制作成動圖展示):
下圖是購物車的需求:
1、首先在Activity中聲明一個List保存從服務器請求回來的數(shù)據(jù)
private List<Shopping> shoppingList = new ArrayList<>();
2谒亦、然后在購物車的實體類(Shopping)中加入一個字段“checks”用來記錄每一條數(shù)據(jù)是否選中的狀態(tài)
private boolean checks;
public boolean isChecks() {
return checks;
}
public void setChecks(boolean checks) {
this.checks = checks;
}
3竭宰、既然無論是點擊item的CheckBox或加、減按鈕份招,還是點擊Activity中的全選切揭,都是Activity中的合計價格發(fā)生變化,那么我就在Activity中寫一個方法锁摔,處理item中的點擊事件廓旬,在Adapter中調(diào)用該方法即可。
/**
* 選中谐腰,加減方法
* @param checks 是否被選中
* @param count 被選中的商品id
* @param number 被選中商品的數(shù)量
*/
public void UpView(boolean checks, int count,int number){
double AllPrice = 0;
int size = 0 ;//用來計數(shù)孕豹,判斷數(shù)據(jù)是否被全部選中
for (Shopping shop:shoppingList) {
if(shop.p_id == count){//查找被選中商品id
shop.setChecks(checks);//改變商品集合shoppingList中的選中狀態(tài)
shop.p_number = number;//同時修改商品數(shù)量
}
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);//是全部被選中十气,改變?nèi)xcheck狀態(tài)為選中
}else{
a = 1;//a=1表示all_checks監(jiān)聽中方法不執(zhí)行
if(!all_checks.isChecked()) a=0;//all_checks未被選中給a賦值0讓all_checks的監(jiān)聽中的方法繼續(xù)執(zhí)行
all_checks.setChecked(false);//不是励背,繼續(xù)維持未選中狀態(tài)
}
}
4、接下來就是Adapter中調(diào)用砸西,調(diào)用很簡單:
//選中監(jiān)聽
holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mainActivity.UpView(isChecked, shopping.p_id, shopping.p_number);
}
});
//數(shù)量減
holder.minus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int minus = 0;//新數(shù)量
if(shopping.p_number>1) {
minus = shopping.p_number-1;
mainActivity.UpView(shopping.isChecks(), shopping.p_id, minus);
}else{
Toast.makeText(context,"數(shù)量不能再少了",Toast.LENGTH_SHORT).show();
}
}
});
//數(shù)量加
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中的監(jiān)聽已經(jīng)處理完了,接下來是Activity中全選(CheckBox)的監(jiān)聽:
/**
* 全選check監(jiān)聽
*/
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);//改變商品選中狀態(tài) AllPrice = AllPrice + Double.valueOf(shop.p_price) * shop.p_number;//計算商品總價
}
prices.setText("¥" + AllPrice);//顯示總價
} else {
b=0;
for (Shopping shop : shoppingList) {
shop.setChecks(false);//改變商品未選中狀態(tài)
}
prices.setText("¥0.0");//價格改為0
}
shopAdapter.clear();
shopAdapter.addItem(shoppingList);//添加改編后的數(shù)據(jù)到list的Adapter
shopAdapter.notifyDataSetChanged();//刷新列表
}
a=0;
}
});
}
6衅疙、至此,購物車的主要功能已經(jīng)實現(xiàn)鸳慈,接下來就是結(jié)算饱溢、刪除以及數(shù)量不能小于1的判斷:
注意:因為結(jié)算和刪除方法類似,這里只貼結(jié)算的代碼走芋;
/**
* 結(jié)算方法
*/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準備掉接口完成結(jié)算
}else{
new_list.add(shop);//剩余商品形成新的購物車列表等待顯示
}
}
if(settlement_list.size()==0){
Toast.makeText(MainActivity.this,"請選中至少一個商品后在結(jié)算",Toast.LENGTH_SHORT).show();
return;
}
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("提示").setMessage("總共"+settlement_list.size()+"個商品绩郎,共"+prices.getText().toString()+"元,是否要結(jié)算翁逞?");
dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//在這里調(diào)結(jié)算接口把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
好了肋杖,以上就是筆者實現(xiàn)的購物車功能,歡迎各位讀者評論提問熄攘,O(∩_∩)O謝謝兽愤!