2016年9月18日 星期日

Android Shopping Cart Tutorial Part 3

Ref : http://www.androiddom.com/2012/06/android-shopping-cart-tutorial-part-3.html

In this part of the Android Shopping Cart Tutorial we will add prices, and calculate the total price for the purchase.


This tutorial is part of a series about building an android based shopping cart, and will build off of existing code and concepts discussed in Android Shopping Cart Tutorial andAndroid Shopping Cart Tutorial Part 2.

Step 1. Prices for Products

In our previous tutorials we learned how to display different products, add them to the cart, and even change the quantity of those products. Now we must add another crucial component, the price.

If you look back at the previous tutorials, our Product object already contains price information, and our initial catalog is setting prices--these prices simply are not being displayed in the app anywhere.



Step 2. Modify the productdetails.xml Layout

In theory, we could append the price to the product description, but we may want it to stand out a little more. To help accomplish this, we will add a separate view to the layout to put the pricing information.

Listed below is the layout xml for the view we will add.

<TextView android:layout_height="wrap_content" android:id="@+id/TextViewProductPrice"
 android:layout_width="fill_parent" android:layout_margin="5dip"
 android:textColor="#000000" android:text="Product Price" android:textStyle="bold"></TextView>



Listed below is the complete source for the productdetails.xml file

<linearlayout android:background="#ffffff"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
 <linearlayout android:id="@+id/LinearLayoutHeader"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal">
   <imageview android:adjustviewbounds="true"
android:id="@+id/ImageViewProduct"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:layout_width="wrap_content"
android:scaletype="fitXY" android:src="@drawable/deadoralive"></imageview>
  <textview android:id="@+id/TextViewProductTitle" android:layout_gravity="center" android:layout_height="wrap_content" android:layout_margin="5dip" android:layout_width="wrap_content" android:text="Dead or Alive" android:textcolor="#000000" android:textsize="26dip"></textview>
 
 </linearlayout>
 
 <textview android:id="@+id/TextViewProductPrice"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:layout_width="fill_parent"
android:text="Product Price"
android:textcolor="#000000"
android:textstyle="bold"></textview>
 
 <textview android:id="@+id/TextViewProductDetails" android:layout_height="wrap_content" android:layout_margin="5dip" android:layout_weight="1" android:layout_width="fill_parent" android:text="Product description" android:textcolor="#000000"></textview>
 
 <linearlayout android:id="@+id/linearLayoutCurrentlyInCart" android:layout_height="wrap_content" android:layout_width="fill_parent">
  <textview android:id="@+id/textViewCurrentlyInCart" android:layout_height="wrap_content" android:layout_margin="5dip" android:layout_width="wrap_content" android:text="Currently in Cart:" android:textcolor="#000000" android:textsize="20dip"></textview>
 </linearlayout>
 
 
 <linearlayout android:id="@+id/linearLayoutAddLayout" android:layout_height="wrap_content" android:layout_margin="5dip" android:layout_width="fill_parent" android:orientation="horizontal">
  <textview android:id="@+id/textView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Quantity:" android:textcolor="#000000"></textview>
  <edittext android:gravity="right" android:id="@+id/editTextQuantity" android:inputtype="number" android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="wrap_content" android:text="1"></edittext>
  <button android:id="@+id/ButtonAddToCart" android:layout_gravity="right" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Set Quantity"></button>
 </linearlayout></linearlayout>



The complete code for the ProductDetialsActivity.java is listed below:

package com.dreamdom.tutorials.shoppingcart;
 
import java.util.List;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
 
public class ProductDetailsActivity extends Activity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
  setContentView(R.layout.productdetails);
 
  List<Product> catalog = ShoppingCartHelper.getCatalog(getResources());
 
  int productIndex = getIntent().getExtras().getInt(
    ShoppingCartHelper.PRODUCT_INDEX);
  final Product selectedProduct = catalog.get(productIndex);
 
  // Set the proper image and text
  ImageView productImageView = (ImageView) findViewById(R.id.ImageViewProduct);
  productImageView.setImageDrawable(selectedProduct.productImage);
  TextView productTitleTextView = (TextView) findViewById(R.id.TextViewProductTitle);
  productTitleTextView.setText(selectedProduct.title);
  TextView productDetailsTextView = (TextView) findViewById(R.id.TextViewProductDetails);
  productDetailsTextView.setText(selectedProduct.description);
   
  TextView productPriceTextView = (TextView) findViewById(R.id.TextViewProductPrice);
  productPriceTextView.setText("$" + selectedProduct.price);
 
  // Update the current quantity in the cart
  TextView textViewCurrentQuantity = (TextView) findViewById(R.id.textViewCurrentlyInCart);
  textViewCurrentQuantity.setText("Currently in Cart: "
    + ShoppingCartHelper.getProductQuantity(selectedProduct));
 
  // Save a reference to the quantity edit text
  final EditText editTextQuantity = (EditText) findViewById(R.id.editTextQuantity);
 
  Button addToCartButton = (Button) findViewById(R.id.ButtonAddToCart);
  addToCartButton.setOnClickListener(new OnClickListener() {
 
   @Override
   public void onClick(View v) {
 
    // Check to see that a valid quantity was entered
    int quantity = 0;
    try {
     quantity = Integer.parseInt(editTextQuantity.getText()
       .toString());
 
     if (quantity < 0) {
      Toast.makeText(getBaseContext(),
        "Please enter a quantity of 0 or higher",
        Toast.LENGTH_SHORT).show();
      return;
     }
 
    } catch (Exception e) {
     Toast.makeText(getBaseContext(),
       "Please enter a numeric quantity",
       Toast.LENGTH_SHORT).show();
 
     return;
    }
 
    // If we make it here, a valid quantity was entered
    ShoppingCartHelper.setQuantity(selectedProduct, quantity);
 
    // Close the activity
    finish();
   }
  });
 
 }
 
}


Step 4. Add a "Total Price" Text View to shoppingcart.xml

Similar to how we modified the ProductDetails.xml layout to include a view for displaying the price, we want to modify the shoppingcart.xml layout to include a view to display the total price.

Listed below is the layout xml for the view we will add:


<TextView android:layout_height="wrap_content" android:id="@+id/TextViewSubtotal"
android:layout_width="fill_parent" android:layout_margin="5dip"
android:textColor="#000000"
android:text="Subtotal"
android:textStyle="bold"></TextView>


And listed below is the full code for shoppingcart.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_height="fill_parent"
 android:layout_width="fill_parent" android:background="#ffffff">
 
 <TextView android:id="@+id/TextView01" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:textColor="#000000"
  android:textSize="24dip" android:layout_margin="5dip" android:text="Shopping Cart"></TextView>
 <TextView android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:text="Click on a product to edit the quantity"></TextView>
  <TextView android:layout_height="wrap_content"
android:id="@+id/TextViewSubtotal"
   android:layout_width="fill_parent"
android:layout_margin="5dip"
   android:textColor="#000000"
android:text="Subtotal" android:textStyle="bold"></TextView>
 <ListView android:layout_height="wrap_content"
  android:layout_weight="1" android:id="@+id/ListViewCatalog"
  android:layout_width="fill_parent" android:background="#ffffff"
  android:cacheColorHint="#ffffff" android:clickable="true"
  android:choiceMode="multipleChoice">
 
 </ListView>
 <LinearLayout android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:orientation="horizontal"
  android:layout_margin="5dip"
  android:id="@+id/LinearLayoutCheckout" android:layout_gravity="right">
  <Button android:id="@+id/Button02" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:text="Proceed to Checkout"></Button>
 </LinearLayout>
 
 
</LinearLayout>


Step 5. Calculate and Display the Total Price in the ShoppingCartActivity file

Now, when the activity loads we will loop through all the items in the cart, add together the prices, and then display this sum as the Total Price.

We will do this in the onResume call, since it is possible to change product quantities in the shopping cart after this activity has been created.

Listed below is the code to add to calculate the subtotal:


double subTotal = 0;
for(Product p : mCartList) {
 int quantity = ShoppingCartHelper.getProductQuantity(p);
 subTotal += p.price * quantity;
}
 
TextView productPriceTextView = (TextView) findViewById(R.id.TextViewSubtotal);
productPriceTextView.setText("Subtotal: $" + subTotal);



And listed below is the full code for the ShoppingCartActivity file:

package com.dreamdom.tutorials.shoppingcart;
 
import java.util.List;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
 
public class ShoppingCartActivity extends Activity {
  
 private List<Product> mCartList;
 private ProductAdapter mProductAdapter;
  
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.shoppingcart);
   
   
  mCartList = ShoppingCartHelper.getCartList();
   
  // Make sure to clear the selections
  for(int i=0; i<mCartList.size(); i++) {
   mCartList.get(i).selected = false;
  }
 
   
  // Create the list
  final ListView listViewCatalog = (ListView) findViewById(R.id.ListViewCatalog);
  mProductAdapter = new ProductAdapter(mCartList, getLayoutInflater(), true);
  listViewCatalog.setAdapter(mProductAdapter);
   
  listViewCatalog.setOnItemClickListener(new OnItemClickListener() {
 
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position,
     long id) {
    Intent productDetailsIntent = new Intent(getBaseContext(),ProductDetailsActivity.class);
    productDetailsIntent.putExtra(ShoppingCartHelper.PRODUCT_INDEX, position);
    startActivity(productDetailsIntent);
   }
  });
   
 }
  
 @Override
 protected void onResume() {
  super.onResume();
   
  // Refresh the data
  if(mProductAdapter != null) {
   mProductAdapter.notifyDataSetChanged();
  }
   
  double subTotal = 0;
  for(Product p : mCartList) {
   int quantity = ShoppingCartHelper.getProductQuantity(p);
   subTotal += p.price * quantity;
  }
   
  TextView productPriceTextView = (TextView) findViewById(R.id.TextViewSubtotal);
  productPriceTextView.setText("Subtotal: $" + subTotal);
 }
 
}


Screenshot of the App in Action

Listed below is a screenshot of the application in action.



Final Notes

It is actually not recommended to use decimals to calculate prices in Java applications. A better option would be to use the BigDecimal class. 
------------------------------------------------------------

We create these tutorials in our free time. If you like what you see please consider buying us a cup of coffee so we can keep creating useful material. Click on the image below to make a donation via Paypal.



沒有留言:

張貼留言