gliyao
6/15/2014 - 6:49 AM

ListViewReuse.java

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// Setup Data
		String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
		        "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
		        "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux",
		        "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
		        "Android", "iPhone", "WindowsMobile" };
		
		ArrayList<Product> list = new ArrayList<Product>();
	    for (int i = 0; i < values.length; ++i) {
	    	// 假設每樣商品都100元, 預設數量為0
	    	Product product = new Product(values[i], 100, i);
	    	list.add(product);
	    }
	    
	    // Create ListView
	    ListView listView = (ListView)findViewById(R.id.listview);
	    ListAdapter adapter = new ListAdapter(this, R.layout.product_main,list);
	    listView.setAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	
	// Inner Class 
	public class ListAdapter extends ArrayAdapter<Product> {
		
		Context mContext;
	    LayoutInflater mInflater;
	    ArrayList<Product> mProducts;
	    
	    
		public ListAdapter(Context context, int resource, ArrayList<Product> products) {
		    super(context, resource, products);
		    mContext = context;
		    mProducts = products;
		    mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent)
		{
			Product product = mProducts.get(position);

			// 若convertView尚未創建
			if(convertView == null)
			{
				// 從記憶體建立一個 view
		        convertView = mInflater.inflate(R.layout.product_main, null);
		        
		        // 取得editView 然後監聽textChanged
		        EditText editText = (EditText)convertView.findViewById(R.id.productCount);
		        editText.addTextChangedListener(new MyTextWatcher(convertView));
		    }
			
			// Setup data
			// 把editText跟product綁在一起
			EditText editText = (EditText)convertView.findViewById(R.id.productCount);
			editText.setTag(product);
			
			// 顯示產品數量
			editText.setText(String.valueOf(product.count));
			
			// 顯示商品名稱
			TextView productNameTextView = (TextView)convertView.findViewById(R.id.productName);
			productNameTextView.setText(product.getName());
			
			// 顯示商品價格
			TextView productPriceTextView = (TextView)convertView.findViewById(R.id.productPrice);
			productPriceTextView.setText(String.valueOf(product.getPrice()));
			
	        return convertView;
		}
	}
	
	public class MyTextWatcher implements TextWatcher{
		View view;
		
		public MyTextWatcher(View view){
			this.view = view;
		}
		
		@Override
		public void afterTextChanged(Editable s) {
			
			// 取得editText的值
			String productCount = s.toString().trim();
			
			//從editView取回product
			EditText editText = (EditText) view.findViewById(R.id.productCount);
			Product product = (Product) editText.getTag();
			
			if (productCount.matches("")) {
				// 如果數值為空則不做任何事情
				Log.d("in", "You got empty value.");
			}
			else{
				// 如果有值則改變product count
				int count = Integer.parseInt(productCount);
				product.count = count;
				Log.d("product", "name = "+ product.getName() +", count = " + count);
			}
			
			
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {			
		}

		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {			
		}
		
	}
	
	// 商品物件
	public class Product {
		private String name; // 名稱
		private int price; //價格
		public int count; //數量
		
		public Product(String name, int price, int count){
			this.setName(name);
			this.setPrice(price);
			this.count = count;
		}

		public int getPrice() {
			return price;
		}

		public void setPrice(int price) {
			this.price = price;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}
	}
}