編輯:關於Android編程
最近寫了一個商城APP中常用功能“購物車”
購物車效果圖如下:
購物車功能需求如下:
下面是購物車主activity“MainActivity”代碼:
import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.util.ArrayList; import java.util.List; import retrofit2.Response; import shop.hsy.com.shopcar.adapter.ShopAdapter; import shop.hsy.com.shopcar.entity.ResultModel; import shop.hsy.com.shopcar.entity.Shopping; import shop.hsy.com.shopcar.net.ShopCarNet; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ListView shop_list; private ShopAdapter shopAdapter; private TextView prices; private CheckBox all_checks; private TextView settlement; private TextView delete_text; private Response>> modelResponse;//接口請求回來的數據 private List shoppingList = new ArrayList<>();//重新整合後的數據 private ProgressDialog progressDialog; private int a=0;//此字段非常重要,用來解決全選與單選沖突 private int b=1;//此字段非常重要,用來解決字段a與全選沖突 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setMessage("······"); initview(); } private void initview(){ shop_list = (ListView) findViewById(R.id.shop_list); shopAdapter = new ShopAdapter(MainActivity.this); shop_list.setAdapter(shopAdapter); all_checks = (CheckBox) findViewById(R.id.all_checks);//全選 prices = (TextView) findViewById(R.id.prices);//價格 settlement = (TextView) findViewById(R.id.settlement);//結算 delete_text = (TextView) findViewById(R.id.delete_text);//刪除 settlement.setOnClickListener(this); delete_text.setOnClickListener(this); getShopData(22+""); AllChecks(); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.settlement: //結算 Settlement(); break; case R.id.delete_text: //刪除 AllDelete(); break; } } /** * 數據接口請求 * @param mid */ private void getShopData(final String mid){ new Thread(new Runnable() { @Override public void run() { try { modelResponse = ShopCarNet.getShop(mid).execute(); Message message = mhandler.obtainMessage(); message.what = 0; message.sendToTarget(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private Handler mhandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 0: if(modelResponse!=null){ if(modelResponse.body()!=null){ if(modelResponse.body().getData()!=null &&modelResponse.body().getData().size()>0){ for (Shopping shop:modelResponse.body().getData()) { shop.setChecks(false);//給商品添加為選中狀態 shoppingList.add(shop); } shopAdapter.addItem(shoppingList); shopAdapter.notifyDataSetChanged(); } } }else{ Log.e("mainactivity","沒有數據"); } break; } } }; /** * 全選check監聽 */ public void AllChecks(){ all_checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { progressDialog.show(); 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; if (progressDialog != null) progressDialog.cancel(); } }); } /** * 選中,加減方法 * @param checks 是否被選中 * @param count 被選中的商品id * @param number 被選中商品的數量 */ public void UpView(boolean checks, int count,int number){ progressDialog.show(); 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);//不是,繼續維持未選中狀態 } if (progressDialog != null) progressDialog.cancel(); } /** * 結算方法 */ public void Settlement(){ List settlement_list = new ArrayList<>(); final List 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) { //在這裡調結算接口把delete_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(); } /** * 刪除方法 * 該方法類似結算方法 */ public void AllDelete(){ List delete_list = new ArrayList<>(); final List new_list = new ArrayList<>(); for (Shopping shop:shoppingList) { if(shop.isChecks()){ delete_list.add(shop.p_id); }else{ new_list.add(shop); } } if(delete_list.size()==0){ Toast.makeText(MainActivity.this,"請選中至少一個商品後在刪除",Toast.LENGTH_SHORT).show(); return; } AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); dialog.setTitle("提示").setMessage("確定要刪除這"+delete_list.size()+"個商品?"); dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //在這裡調刪除接口把delete_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(); } }
MainActivity的布局文件很簡單:
購物車Adapter代碼“ShopAdapter”,由於我繼承一個BaseAtapter,所以這個Adapter我只需要處理getView方法:
import android.content.Context; import android.graphics.Paint; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.nostra13.universalimageloader.core.ImageLoader; import shop.hsy.com.shopcar.MainActivity; import shop.hsy.com.shopcar.MyApplication; import shop.hsy.com.shopcar.R; import shop.hsy.com.shopcar.entity.Shopping; /** * Created by hsy on 2016/11/10. */ public class ShopAdapter extends BaseAdapter { private LayoutInflater inflater; private Context context; private MainActivity mainActivity; public ShopAdapter(Context context) { this.context = context; mainActivity = (MainActivity)context; inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.shop_item, parent, false); holder.checks = (CheckBox) convertView.findViewById(R.id.checks);//選擇框 holder.p_img1 = (ImageView) convertView.findViewById(R.id.p_img1);//商品縮略圖 holder.p_name = (TextView) convertView.findViewById(R.id.p_name);//名稱 holder.p_price = (TextView) convertView.findViewById(R.id.p_price);//價格 holder.p_mprice = (TextView) convertView.findViewById(R.id.p_mprice);//過時價格 holder.p_discount = (TextView) convertView.findViewById(R.id.p_discount);//折扣 holder.p_news = (TextView) convertView.findViewById(R.id.p_news);//成色 holder.p_stock = (TextView) convertView.findViewById(R.id.p_stock);//庫存 holder.p_number = (TextView) convertView.findViewById(R.id.p_number);//數量 holder.minus = (ImageView) convertView.findViewById(R.id.minus);//減 holder.add = (ImageView) convertView.findViewById(R.id.add);//加 convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Shopping shopping = (Shopping) getItem(position); if (!TextUtils.isEmpty(shopping.p_img1)) { ImageLoader.getInstance().displayImage(shopping.p_img1, holder.p_img1, MyApplication.option); }else { holder.p_img1.setImageResource(R.mipmap.ic_launcher); } holder.p_name.setText(shopping.p_name); holder.p_price.setText(shopping.p_price); holder.p_mprice.setText(shopping.p_mprice); holder.p_discount.setText(shopping.p_discount); holder.p_news.setText(shopping.p_news); holder.p_number.setText(shopping.p_number+""); holder.p_stock.setText(shopping.p_stock); holder.checks.setChecked(shopping.isChecks()); holder.p_mprice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); //全選監聽 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)); } }); return convertView; } private class ViewHolder { private CheckBox checks; private ImageView p_img1; private TextView p_name; private TextView p_price; private TextView p_mprice; private TextView p_discount; private TextView p_news; private TextView p_stock; private TextView p_number; private ImageView minus; private ImageView add; } }
Adapter布局文件:
至此,購物車功能就實現了,這裡最主要的就是MainActivity中的UpView方法,其次就是CheckBox的監聽(setOnCheckedChangeListener); 注意 :在MainActivity中我用了a和b兩個字段來解決Adapter中的CheckBox監聽和Activity中的CheckBox監聽沖突問題。
源碼下載
本文為大家講解的是Android Studio安裝後啟動時Fetching android sdk component information超時的解決方案,感興趣的同
想要的效果最近項目中想實現一個效果,效果如下:網上demo展示就是上滑或者下滑,能實現彈性效果,剛開始在網上找了好幾個demo,代碼大致如下:public class B
本文實例講述了Android實現手機壁紙改變的方法。分享給大家供大家參考。具體如下:main.xml布局文件:<?xml version=1.0 encod
從2012年自學Android開始,到現在第4個年頭了,期間一直沒接觸正規的Android項目,加上這幾年一直忙.NET項目,導致去年有兩單Android的私活沒底氣接,