Android-ListView状态保存以及和Activity进行交互

一、适用场景

ListView的每个Item的状态和数据可以进行修改,修改的状态可以保存;修改后的数据要动态的更新反馈给Activity。

二、关键代码

1.CarActivity

该类可以自己定义,这里只是传递一个对象到Adapter中,用于数据的及时反馈。在尝试成功该种方案之前,我考虑的是使用Handler及时的发送消息,来进行数据的及时更新,但是该方案有问题,暂时还没找到解决方法,主要问题是,只要发送消息,就会出现死循环,反馈的数据不断的在变化。如果那位朋友知道如何使用handler实现这种效果,可以和我交流一下,我也来学习学习。

  1. package com.example.chinabuye.activity; 
  2.  
  3. import http.HttpRestClient; 
  4. import http.JsonHttpResponseHandler; 
  5.  
  6. import java.util.ArrayList; 
  7. import java.util.HashMap; 
  8. import java.util.Iterator; 
  9. import java.util.List; 
  10. import java.util.Map.Entry; 
  11.  
  12. import org.json.JSONArray; 
  13. import org.json.JSONException; 
  14. import org.json.JSONObject; 
  15.  
  16. import tools.Token; 
  17. import tools.UserInfo; 
  18. import android.app.Activity; 
  19. import android.content.Intent; 
  20. import android.os.Bundle; 
  21. import android.os.Handler; 
  22. import android.util.Log; 
  23. import android.view.View; 
  24. import android.view.View.OnClickListener; 
  25. import android.widget.Button; 
  26. import android.widget.ImageView; 
  27. import android.widget.ListView; 
  28. import android.widget.TextView; 
  29. import bean.CartGoodBean; 
  30. import bean.CartStateBean; 
  31.  
  32. import com.example.chinabuye.R; 
  33. import com.example.chinabuye.adapter.CartAdapter; 
  34. import com.example.chinabuye.tools.MathTools; 
  35. import com.example.chinabuye.tools.PriceTools; 
  36.  
  37. public class CartActivity extends Activity implements OnClickListener { 
  38.     private static final String TAG = "CartActivity-->>"
  39.     private static final int Token_Obsolete = 1
  40.     private static final int Get_NewToken = 2
  41.     private String customerid; 
  42.     private String accessToken; 
  43.     private ListView listView_cart; 
  44.     private CartAdapter adapter; 
  45.     private List<CartGoodBean> data; 
  46.     private Button checkOut; 
  47.     private TextView totalPrice; 
  48.  
  49.     @Override 
  50.     protected void onCreate(Bundle savedInstanceState) { 
  51.         super.onCreate(savedInstanceState); 
  52.         customerid = UserInfo.getUserInfoInstance().getUserid(); 
  53.         accessToken = Token.getTokenInstance().getAccessToken(); 
  54.         showCartList(accessToken); 
  55.  
  56.     } 
  57.  
  58.     /*** 显示购物车产品列表 ***/ 
  59.     private void showCartList(String accessToken) { 
  60.         HttpRestClient.getCartList(this, customerid, accessToken, new JsonHttpResponseHandler() { 
  61.             @Override 
  62.             public void onSuccess(JSONObject response) { 
  63.                 super.onSuccess(response); 
  64.                 try
  65.                     if ("true".equals(response.getString("result"))) { 
  66.                         JSONArray rootArray = response.getJSONArray("products"); 
  67.                         int size = rootArray.length(); 
  68.                         if (size == 0) { 
  69.                             showNoProducLayout(); 
  70.                         } else
  71.                             showProductLayout(rootArray); 
  72.                         } 
  73.                     } else
  74.                         handler.sendEmptyMessage(Token_Obsolete); 
  75.                     } 
  76.                 } catch (JSONException e) { 
  77.                     e.printStackTrace(); 
  78.                 } 
  79.             } 
  80.         }); 
  81.     } 
  82.  
  83.     /**** 数据解析 ***/ 
  84.     private void jsonParser(JSONArray rootArray) { 
  85.         try
  86.             for (int x = 0; x < rootArray.length(); x++) { 
  87.                 JSONObject obj = rootArray.getJSONObject(x); 
  88.                 int number = obj.getInt("qty"); 
  89.                 String specifications = obj.getString("sku"); 
  90.                 String name = obj.getString("name"); 
  91.                 String weight = obj.getString("weight"); 
  92.                 String price = obj.getString("price"); 
  93.                 String totalWeight = obj.getString("row_weight"); 
  94.                 String totalPrice = obj.getString("row_total"); 
  95.                 String image = obj.getString("thumbnail"); 
  96.  
  97.                 CartGoodBean bean = new CartGoodBean(); 
  98.                 bean.setSku(specifications); 
  99.                 bean.setName(name); 
  100.                 bean.setWeight(weight); 
  101.                 bean.setNumber(number); 
  102.                 bean.setPrice(price); 
  103.                 bean.setImage(image); 
  104.  
  105.                 bean.setTotalWeight(totalWeight); 
  106.                 bean.setTotalPrice(totalPrice); 
  107.                 data.add(bean); 
  108.             } 
  109.             adapter = new CartAdapter(CartActivity.this, data, R.layout.listview_item_cart, totalPrice); 
  110.             listView_cart.setAdapter(adapter); 
  111.             adapter.notifyDataSetChanged(); 
  112.  
  113.         } catch (JSONException e) { 
  114.             e.printStackTrace(); 
  115.         } 
  116.  
  117.     } 
  118.  
  119.     /**** 显示有产品的布局 *******/ 
  120.     private void showProductLayout(JSONArray rootArray) { 
  121.         setContentView(R.layout.activity_cart); 
  122.         initView(); 
  123.         jsonParser(rootArray); 
  124.     } 
  125.  
  126.     /**** 初始化有产品时的控件 ***/ 
  127.     private void initView() { 
  128.         initCommonView(); 
  129.         listView_cart = (ListView) this.findViewById(R.id.listView_cart); 
  130.         View footerView = getLayoutInflater().inflate(R.layout.listview_footerview_cart, null); 
  131.         listView_cart.addFooterView(footerView); 
  132.         checkOut = (Button) this.findViewById(R.id.checkoutButton); 
  133.         checkOut.setOnClickListener(this); 
  134.         totalPrice = (TextView) this.findViewById(R.id.total_price); 
  135.         totalPrice.setText("$0.00"); 
  136.         data = new ArrayList<CartGoodBean>(); 
  137.     } 
  138.  
  139.     /****** 初始化标题栏 ***/ 
  140.     private void initCommonView() { 
  141.         ImageView back = (ImageView) this.findViewById(R.id.back_to_home); 
  142.         back.setOnClickListener(this); 
  143.     } 
  144.  
  145.     /*** 显示没有产品的布局 *****/ 
  146.     private void showNoProducLayout() { 
  147.         setContentView(R.layout.activity_cart_none); 
  148.         TextView goShopping = (TextView) this.findViewById(R.id.cart_goshopping); 
  149.         goShopping.setOnClickListener(this); 
  150.     } 
  151.  
  152.     Handler handler = new Handler() { 
  153.         public void handleMessage(android.os.Message msg) { 
  154.  
  155.             switch (msg.what) { 
  156.             case Token_Obsolete: 
  157.                 getNewToken(); 
  158.                 break
  159.             case Get_NewToken: 
  160.                 String newAccessToken = msg.obj.toString(); 
  161.                 showCartList(newAccessToken); 
  162.                 break
  163.             } 
  164.         }; 
  165.     }; 
  166.  
  167.     /** 获取Token ***/ 
  168.     private void getNewToken() { 
  169.         HttpRestClient.getToken(CartActivity.this, Token.key, Token.secret, new JsonHttpResponseHandler() { 
  170.             @Override 
  171.             public void onSuccess(JSONObject response) { 
  172.                 super.onSuccess(response); 
  173.                 try
  174.                     if ("true".equals(response.getString("result"))) { 
  175.                         String newAccessToken = response.getString("ACCESSTOKEN"); 
  176.                         handler.obtainMessage(Get_NewToken, newAccessToken).sendToTarget(); 
  177.                     } 
  178.                 } catch (JSONException e) { 
  179.                     e.printStackTrace(); 
  180.                 } 
  181.             } 
  182.         }); 
  183.     } 
  184.  
  185.     @Override 
  186.     public void onClick(View v) { 
  187.         switch (v.getId()) { 
  188.         case R.id.back_to_home: 
  189.             Intent intent = new Intent(CartActivity.this, MainActivity.class); 
  190.             startActivity(intent); 
  191.             finish(); 
  192.             break
  193.         case R.id.cart_goshopping: 
  194.             Intent intent2 = new Intent(CartActivity.this, MainActivity.class); 
  195.             startActivity(intent2); 
  196.             finish(); 
  197.             break
  198.         case R.id.checkoutButton: 
  199.             Intent intent3 = new Intent(CartActivity.this, CheckoutActivity.class); 
  200.             startActivity(intent3); 
  201.             finish(); 
  202.             break
  203.         default
  204.             break
  205.         } 
  206.  
  207.     } 
package com.example.chinabuye.activity;

import http.HttpRestClient;
import http.JsonHttpResponseHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import tools.Token;
import tools.UserInfo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import bean.CartGoodBean;
import bean.CartStateBean;

import com.example.chinabuye.R;
import com.example.chinabuye.adapter.CartAdapter;
import com.example.chinabuye.tools.MathTools;
import com.example.chinabuye.tools.PriceTools;

public class CartActivity extends Activity implements OnClickListener {
	private static final String TAG = "CartActivity-->>";
	private static final int Token_Obsolete = 1;
	private static final int Get_NewToken = 2;
	private String customerid;
	private String accessToken;
	private ListView listView_cart;
	private CartAdapter adapter;
	private List<CartGoodBean> data;
	private Button checkOut;
	private TextView totalPrice;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		customerid = UserInfo.getUserInfoInstance().getUserid();
		accessToken = Token.getTokenInstance().getAccessToken();
		showCartList(accessToken);

	}

	/*** 显示购物车产品列表 ***/
	private void showCartList(String accessToken) {
		HttpRestClient.getCartList(this, customerid, accessToken, new JsonHttpResponseHandler() {
			@Override
			public void onSuccess(JSONObject response) {
				super.onSuccess(response);
				try {
					if ("true".equals(response.getString("result"))) {
						JSONArray rootArray = response.getJSONArray("products");
						int size = rootArray.length();
						if (size == 0) {
							showNoProducLayout();
						} else {
							showProductLayout(rootArray);
						}
					} else {
						handler.sendEmptyMessage(Token_Obsolete);
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**** 数据解析 ***/
	private void jsonParser(JSONArray rootArray) {
		try {
			for (int x = 0; x < rootArray.length(); x++) {
				JSONObject obj = rootArray.getJSONObject(x);
				int number = obj.getInt("qty");
				String specifications = obj.getString("sku");
				String name = obj.getString("name");
				String weight = obj.getString("weight");
				String price = obj.getString("price");
				String totalWeight = obj.getString("row_weight");
				String totalPrice = obj.getString("row_total");
				String image = obj.getString("thumbnail");

				CartGoodBean bean = new CartGoodBean();
				bean.setSku(specifications);
				bean.setName(name);
				bean.setWeight(weight);
				bean.setNumber(number);
				bean.setPrice(price);
				bean.setImage(image);

				bean.setTotalWeight(totalWeight);
				bean.setTotalPrice(totalPrice);
				data.add(bean);
			}
			adapter = new CartAdapter(CartActivity.this, data, R.layout.listview_item_cart, totalPrice);
			listView_cart.setAdapter(adapter);
			adapter.notifyDataSetChanged();

		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

	/**** 显示有产品的布局 *******/
	private void showProductLayout(JSONArray rootArray) {
		setContentView(R.layout.activity_cart);
		initView();
		jsonParser(rootArray);
	}

	/**** 初始化有产品时的控件 ***/
	private void initView() {
		initCommonView();
		listView_cart = (ListView) this.findViewById(R.id.listView_cart);
		View footerView = getLayoutInflater().inflate(R.layout.listview_footerview_cart, null);
		listView_cart.addFooterView(footerView);
		checkOut = (Button) this.findViewById(R.id.checkoutButton);
		checkOut.setOnClickListener(this);
		totalPrice = (TextView) this.findViewById(R.id.total_price);
		totalPrice.setText("$0.00");
		data = new ArrayList<CartGoodBean>();
	}

	/****** 初始化标题栏 ***/
	private void initCommonView() {
		ImageView back = (ImageView) this.findViewById(R.id.back_to_home);
		back.setOnClickListener(this);
	}

	/*** 显示没有产品的布局 *****/
	private void showNoProducLayout() {
		setContentView(R.layout.activity_cart_none);
		TextView goShopping = (TextView) this.findViewById(R.id.cart_goshopping);
		goShopping.setOnClickListener(this);
	}

	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {

			switch (msg.what) {
			case Token_Obsolete:
				getNewToken();
				break;
			case Get_NewToken:
				String newAccessToken = msg.obj.toString();
				showCartList(newAccessToken);
				break;
			}
		};
	};

	/** 获取Token ***/
	private void getNewToken() {
		HttpRestClient.getToken(CartActivity.this, Token.key, Token.secret, new JsonHttpResponseHandler() {
			@Override
			public void onSuccess(JSONObject response) {
				super.onSuccess(response);
				try {
					if ("true".equals(response.getString("result"))) {
						String newAccessToken = response.getString("ACCESSTOKEN");
						handler.obtainMessage(Get_NewToken, newAccessToken).sendToTarget();
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.back_to_home:
			Intent intent = new Intent(CartActivity.this, MainActivity.class);
			startActivity(intent);
			finish();
			break;
		case R.id.cart_goshopping:
			Intent intent2 = new Intent(CartActivity.this, MainActivity.class);
			startActivity(intent2);
			finish();
			break;
		case R.id.checkoutButton:
			Intent intent3 = new Intent(CartActivity.this, CheckoutActivity.class);
			startActivity(intent3);
			finish();
			break;
		default:
			break;
		}

	}
}
2.CartAdapter

这个才是最关键的类,在这里可以进行用户选择状态的保存,用户数据修改状态的保存,以及数据反馈和及时更新

  1. package com.example.chinabuye.adapter; 
  2.  
  3. import http.HttpUrls; 
  4.  
  5. import java.util.HashMap; 
  6. import java.util.List; 
  7. import java.util.Map.Entry; 
  8.  
  9. import android.content.Context; 
  10. import android.graphics.Bitmap; 
  11. import android.os.Handler; 
  12. import android.os.Message; 
  13. import android.util.Log; 
  14. import android.view.LayoutInflater; 
  15. import android.view.View; 
  16. import android.view.View.OnClickListener; 
  17. import android.view.ViewGroup; 
  18. import android.widget.BaseAdapter; 
  19. import android.widget.CheckBox; 
  20. import android.widget.CompoundButton; 
  21. import android.widget.CompoundButton.OnCheckedChangeListener; 
  22. import android.widget.ImageView; 
  23. import android.widget.TextView; 
  24. import android.widget.Toast; 
  25. import bean.CartGoodBean; 
  26. import bean.CartStateBean; 
  27.  
  28. import com.example.chinabuye.R; 
  29. import com.example.chinabuye.activity.CartActivity; 
  30. import com.example.chinabuye.app.Options; 
  31. import com.example.chinabuye.tools.MathTools; 
  32. import com.example.chinabuye.tools.PriceTools; 
  33. import com.nostra13.universalimageloader.core.ImageLoader; 
  34. import com.nostra13.universalimageloader.core.assist.FailReason; 
  35. import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; 
  36.  
  37. public class CartAdapter extends BaseAdapter { 
  38.     private static final String TAG = "CartAdapter"
  39.     private Context context; 
  40.     private List<CartGoodBean> data; 
  41.     private int layout; 
  42.     private TextView totalPrice; 
  43.     private static HashMap<Integer, CartStateBean> isProductSelected;//状态保存,保存有产品的选中状态和选择的数量 
  44.  
  45.     public CartAdapter(Context context, List<CartGoodBean> data, int layout, TextView totalPrice) { 
  46.         super(); 
  47.         this.context = context; 
  48.         this.data = data; 
  49.         this.layout = layout; 
  50.         this.totalPrice = totalPrice; 
  51.         isProductSelected = new HashMap<Integer, CartStateBean>(); 
  52.         initDate(); 
  53.     } 
  54.  
  55.     public static HashMap<Integer, CartStateBean> getIsProductSelected() { 
  56.         return isProductSelected; 
  57.     } 
  58.  
  59.     public static void setIsProductSelected(HashMap<Integer, CartStateBean> isProductSelected) { 
  60.         CartAdapter.isProductSelected = isProductSelected; 
  61.     } 
  62.  
  63.     /***** 初始化最初状态 *******/ 
  64.     private void initDate() { 
  65.         for (int x = 0; x < data.size(); x++) { 
  66.             CartStateBean bean = new CartStateBean(); 
  67.             bean.setState(false); 
  68.             bean.setSelectedNumber(data.get(x).getNumber()); 
  69.             String totalPrice = data.get(x).getTotalPrice(); 
  70.             bean.setTotalPrice(Float.parseFloat(totalPrice)); 
  71.             getIsProductSelected().put(x, bean); 
  72.         } 
  73.     } 
  74.  
  75.     @Override 
  76.     public int getCount() { 
  77.         return data.size(); 
  78.     } 
  79.  
  80.     @Override 
  81.     public Object getItem(int position) { 
  82.         return data.get(position); 
  83.     } 
  84.  
  85.     @Override 
  86.     public long getItemId(int position) { 
  87.         return position; 
  88.     } 
  89.  
  90.     @Override 
  91.     public View getView(final int position, View convertView, ViewGroup parent) { 
  92.         final CartHolder holder; 
  93.         if (convertView == null) { 
  94.             holder = new CartHolder(); 
  95.             convertView = LayoutInflater.from(context).inflate(layout, null); 
  96.             //          convertView = LayoutInflater.from(context).inflate(R.layout.listview_item_cart, null); 
  97.             holder.image = (ImageView) convertView.findViewById(R.id.cart_image); 
  98.             holder.name = (TextView) convertView.findViewById(R.id.cart_name); 
  99.             holder.price = (TextView) convertView.findViewById(R.id.cart_price); 
  100.             holder.pnumber = (TextView) convertView.findViewById(R.id.cart_selectedNum); 
  101.             holder.checkBox = (CheckBox) convertView.findViewById(R.id.cart_select); 
  102.             holder.specifications = (TextView) convertView.findViewById(R.id.specifications); 
  103.             holder.reduce = (ImageView) convertView.findViewById(R.id.cart_reduce); 
  104.             holder.add = (ImageView) convertView.findViewById(R.id.cart_add); 
  105.             convertView.setTag(holder); 
  106.         } else
  107.             holder = (CartHolder) convertView.getTag(); 
  108.         } 
  109.         final CartGoodBean bean = data.get(position);//数据bean 
  110.  
  111.         holder.name.setText(bean.getName()); 
  112.         holder.price.setText(PriceTools.formatPrice(bean.getTotalPrice()));//最初的总的价格 
  113.         holder.pnumber.setText(bean.getNumber() + "");//初始数量 
  114.         holder.specifications.setText(bean.getSku()); 
  115.         String uri = HttpUrls.PICTURE + bean.getImage(); 
  116.         ImageLoader.getInstance().displayImage(uri, holder.image, Options.getListOptions(), new ImageLoadingListener() { 
  117.  
  118.             @Override 
  119.             public void onLoadingStarted(String imageUri, View view) { 
  120.                 // TODO Auto-generated method stub 
  121.  
  122.             } 
  123.  
  124.             @Override 
  125.             public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
  126.                 // TODO Auto-generated method stub 
  127.  
  128.             } 
  129.  
  130.             @Override 
  131.             public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
  132.                 ((ImageView) view).setImageBitmap(loadedImage); 
  133.  
  134.             } 
  135.  
  136.             @Override 
  137.             public void onLoadingCancelled(String imageUri, View view) { 
  138.                 // TODO Auto-generated method stub 
  139.  
  140.             } 
  141.         }); 
  142.  
  143.         final CartStateBean stateBean = getIsProductSelected().get(position);//状态bean 
  144.  
  145.         holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
  146.  
  147.             @Override 
  148.             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
  149.                 stateBean.setState(isChecked); 
  150.                 changePrice(); 
  151.             } 
  152.         }); 
  153.         holder.reduce.setOnClickListener(new OnClickListener() { 
  154.             @Override 
  155.             public void onClick(View v) { 
  156.                 int num = stateBean.getSelectedNumber(); 
  157.                 if (num == 1) { 
  158.                     Toast.makeText(context, "now is only one", 0).show(); 
  159.                 } else
  160.                     num--; 
  161.                     float price = Float.parseFloat(bean.getPrice()); 
  162.                     float totalPrice = MathTools.roundMath(num * price); 
  163.                     String totalPrice2 = PriceTools.formatPrice(totalPrice + ""); 
  164.                     holder.price.setText(totalPrice2); 
  165.                     holder.pnumber.setText(num + ""); 
  166.  
  167.                     stateBean.setSelectedNumber(num); 
  168.                     stateBean.setTotalPrice(totalPrice); 
  169.  
  170.                 } 
  171.                 if (stateBean.getState()) { 
  172.                     changePrice(); 
  173.                 } 
  174.             } 
  175.         }); 
  176.         holder.add.setOnClickListener(new OnClickListener() { 
  177.  
  178.             @Override 
  179.             public void onClick(View v) { 
  180.                 int num = stateBean.getSelectedNumber(); 
  181.                 num++; 
  182.  
  183.                 float price = Float.parseFloat(bean.getPrice()); 
  184.                 float totalPrice = MathTools.roundMath(num * price); 
  185.                 String totalPrice2 = PriceTools.formatPrice(totalPrice + ""); 
  186.                 holder.price.setText(totalPrice2); 
  187.                 holder.pnumber.setText(num + ""); 
  188.  
  189.                 stateBean.setSelectedNumber(num); 
  190.                 stateBean.setTotalPrice(totalPrice); 
  191.  
  192.                 if (stateBean.getState()) { 
  193.                     changePrice(); 
  194.                 } 
  195.             } 
  196.         }); 
  197.         /*
  198.          * 购物车的产品一次请求完毕,不需要下拉刷新,所以data的大小是固定的
  199.          *
  200.          */ 
  201.         if (getIsProductSelected().containsKey(position)) {//状态还原 
  202.             holder.checkBox.setChecked(stateBean.getState()); 
  203.             holder.pnumber.setText(stateBean.getSelectedNumber() + ""); 
  204.             String priceStr = PriceTools.formatPrice(stateBean.getTotalPrice() + ""); 
  205.             holder.price.setText(priceStr); 
  206.             changePrice(); 
  207.         } 
  208.         notifyDataSetChanged(); 
  209.         return convertView; 
  210.     } 
  211.  
  212.     private void changePrice() { 
  213.         float priceNumber = 0.0f; 
  214.         for (Entry<Integer, CartStateBean> map : isProductSelected.entrySet()) { 
  215.             CartStateBean bean2 = map.getValue(); 
  216.             if (bean2.getState()) 
  217.                 priceNumber += bean2.getTotalPrice(); 
  218.         } 
  219.         totalPrice.setText(PriceTools.formatPrice(priceNumber + "")); 
  220.     } 
  221.  
  222.     private class CartHolder { 
  223.         private ImageView image; 
  224.         private TextView name; 
  225.         private TextView price; 
  226.         private CheckBox checkBox; 
  227.         private TextView specifications; 
  228.         private ImageView reduce; 
  229.         private ImageView add; 
  230.         private TextView pnumber; 
  231.     } 
package com.example.chinabuye.adapter;

import http.HttpUrls;

import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import bean.CartGoodBean;
import bean.CartStateBean;

import com.example.chinabuye.R;
import com.example.chinabuye.activity.CartActivity;
import com.example.chinabuye.app.Options;
import com.example.chinabuye.tools.MathTools;
import com.example.chinabuye.tools.PriceTools;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

public class CartAdapter extends BaseAdapter {
	private static final String TAG = "CartAdapter";
	private Context context;
	private List<CartGoodBean> data;
	private int layout;
	private TextView totalPrice;
	private static HashMap<Integer, CartStateBean> isProductSelected;//状态保存,保存有产品的选中状态和选择的数量

	public CartAdapter(Context context, List<CartGoodBean> data, int layout, TextView totalPrice) {
		super();
		this.context = context;
		this.data = data;
		this.layout = layout;
		this.totalPrice = totalPrice;
		isProductSelected = new HashMap<Integer, CartStateBean>();
		initDate();
	}

	public static HashMap<Integer, CartStateBean> getIsProductSelected() {
		return isProductSelected;
	}

	public static void setIsProductSelected(HashMap<Integer, CartStateBean> isProductSelected) {
		CartAdapter.isProductSelected = isProductSelected;
	}

	/***** 初始化最初状态 *******/
	private void initDate() {
		for (int x = 0; x < data.size(); x++) {
			CartStateBean bean = new CartStateBean();
			bean.setState(false);
			bean.setSelectedNumber(data.get(x).getNumber());
			String totalPrice = data.get(x).getTotalPrice();
			bean.setTotalPrice(Float.parseFloat(totalPrice));
			getIsProductSelected().put(x, bean);
		}
	}

	@Override
	public int getCount() {
		return data.size();
	}

	@Override
	public Object getItem(int position) {
		return data.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		final CartHolder holder;
		if (convertView == null) {
			holder = new CartHolder();
			convertView = LayoutInflater.from(context).inflate(layout, null);
			//			convertView = LayoutInflater.from(context).inflate(R.layout.listview_item_cart, null);
			holder.image = (ImageView) convertView.findViewById(R.id.cart_image);
			holder.name = (TextView) convertView.findViewById(R.id.cart_name);
			holder.price = (TextView) convertView.findViewById(R.id.cart_price);
			holder.pnumber = (TextView) convertView.findViewById(R.id.cart_selectedNum);
			holder.checkBox = (CheckBox) convertView.findViewById(R.id.cart_select);
			holder.specifications = (TextView) convertView.findViewById(R.id.specifications);
			holder.reduce = (ImageView) convertView.findViewById(R.id.cart_reduce);
			holder.add = (ImageView) convertView.findViewById(R.id.cart_add);
			convertView.setTag(holder);
		} else {
			holder = (CartHolder) convertView.getTag();
		}
		final CartGoodBean bean = data.get(position);//数据bean

		holder.name.setText(bean.getName());
		holder.price.setText(PriceTools.formatPrice(bean.getTotalPrice()));//最初的总的价格
		holder.pnumber.setText(bean.getNumber() + "");//初始数量
		holder.specifications.setText(bean.getSku());
		String uri = HttpUrls.PICTURE + bean.getImage();
		ImageLoader.getInstance().displayImage(uri, holder.image, Options.getListOptions(), new ImageLoadingListener() {

			@Override
			public void onLoadingStarted(String imageUri, View view) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
				((ImageView) view).setImageBitmap(loadedImage);

			}

			@Override
			public void onLoadingCancelled(String imageUri, View view) {
				// TODO Auto-generated method stub

			}
		});

		final CartStateBean stateBean = getIsProductSelected().get(position);//状态bean

		holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				stateBean.setState(isChecked);
				changePrice();
			}
		});
		holder.reduce.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				int num = stateBean.getSelectedNumber();
				if (num == 1) {
					Toast.makeText(context, "now is only one", 0).show();
				} else {
					num--;
					float price = Float.parseFloat(bean.getPrice());
					float totalPrice = MathTools.roundMath(num * price);
					String totalPrice2 = PriceTools.formatPrice(totalPrice + "");
					holder.price.setText(totalPrice2);
					holder.pnumber.setText(num + "");

					stateBean.setSelectedNumber(num);
					stateBean.setTotalPrice(totalPrice);

				}
				if (stateBean.getState()) {
					changePrice();
				}
			}
		});
		holder.add.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				int num = stateBean.getSelectedNumber();
				num++;

				float price = Float.parseFloat(bean.getPrice());
				float totalPrice = MathTools.roundMath(num * price);
				String totalPrice2 = PriceTools.formatPrice(totalPrice + "");
				holder.price.setText(totalPrice2);
				holder.pnumber.setText(num + "");

				stateBean.setSelectedNumber(num);
				stateBean.setTotalPrice(totalPrice);

				if (stateBean.getState()) {
					changePrice();
				}
			}
		});
		/*
		 * 购物车的产品一次请求完毕,不需要下拉刷新,所以data的大小是固定的
		 * 
		 */
		if (getIsProductSelected().containsKey(position)) {//状态还原
			holder.checkBox.setChecked(stateBean.getState());
			holder.pnumber.setText(stateBean.getSelectedNumber() + "");
			String priceStr = PriceTools.formatPrice(stateBean.getTotalPrice() + "");
			holder.price.setText(priceStr);
			changePrice();
		}
		notifyDataSetChanged();
		return convertView;
	}

	private void changePrice() {
		float priceNumber = 0.0f;
		for (Entry<Integer, CartStateBean> map : isProductSelected.entrySet()) {
			CartStateBean bean2 = map.getValue();
			if (bean2.getState())
				priceNumber += bean2.getTotalPrice();
		}
		totalPrice.setText(PriceTools.formatPrice(priceNumber + ""));
	}

	private class CartHolder {
		private ImageView image;
		private TextView name;
		private TextView price;
		private CheckBox checkBox;
		private TextView specifications;
		private ImageView reduce;
		private ImageView add;
		private TextView pnumber;
	}
}
3.效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值