简体   繁体   中英

How can I update the total price shown for each item right away in the listView once I delete one of the items?

I have a listView which displays clothing items in my shopping cart from my existing database and at the bottom it shows you the total price of all the items in my cart. When I delete items from my cart, the listView does get updated, it removes the item, but the total price that displays at the bottom does not get updated when I delete this item and this total price just comes from a query that does SUM(Price) from my table which contains my items in my cart. I've posted my some of my code below and if anyone can help, that would be great.

DatabaseHelper.java

 package ankitkaushal.app.healthysizing; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; public class DatabaseHelper extends SQLiteOpenHelper { public static String DB_PATH = "/data/data/ankitkaushal.app.healthysizing/databases/"; public static String DB_NAME = "FinishDatabase"; public static final int DB_VERSION = 1; public static final String shoppingCartTable = "OPS_insert"; private SQLiteDatabase myDB; private Context context; public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.context = context; } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } @Override public synchronized void close(){ if(myDB!=null){ myDB.close(); } super.close(); } // Retrieves all shirt and pant items of the specified brand typed into the search bar public ArrayList<Item> getAllSearchedItems(String brand, String table_name, String size) { if (size.equals("null")) { brand = "\\"" + brand + "\\""; ArrayList<Item> itemList = new ArrayList<Item>(); String query = "SELECT * FROM " + table_name + " WHERE Brand LIKE " + brand + " ORDER BY Price ASC"; //query to get all the shirt or pant items for brand typed in SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); itemList.add(item); } while (cursor.moveToNext()); } return itemList; } else { brand = "\\"" + brand + "\\""; ArrayList<Item> itemList = new ArrayList<Item>(); String query = "SELECT * FROM " + table_name + " WHERE Brand LIKE " + brand + " AND Size = '" + size + "' ORDER BY Price ASC"; //query to get all the shirt or pant items for brand typed in SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); itemList.add(item); } while (cursor.moveToNext()); } return itemList; } } // Retrieves all shirt or pant items from the database public ArrayList<Item> getAllItems(String table_name, String size) { if (size.equals("null")) { ArrayList<Item> itemList = new ArrayList<Item>(); String query = "SELECT * FROM " + table_name + " ORDER BY Price ASC"; //query to get all the shirt or pant items SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); itemList.add(item); } while (cursor.moveToNext()); } return itemList; } else { ArrayList<Item> itemList = new ArrayList<Item>(); String query = "SELECT * FROM " + table_name + " WHERE Size = '" + size + "' ORDER BY Price ASC"; //query to get all the shirt or pant items SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); itemList.add(item); } while (cursor.moveToNext()); } return itemList; } } // Retrieves all shoe items from the database public ArrayList<Item> getAllShoes() { ArrayList<Item> shoeList = new ArrayList<Item>(); String query = "SELECT * FROM Shoes ORDER BY Price ASC "; // query to get all shoe items SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setGender(cursor.getString(4)); item.setID(cursor.getString(5)); item.setSize("See Description"); shoeList.add(item); } while (cursor.moveToNext()); } return shoeList; } // Retrieves all shoe items of specified brand typed into the search bar public ArrayList<Item> getAllSearchedShoes(String brand) { brand = "\\"" + brand + "\\""; ArrayList<Item> shoeList = new ArrayList<Item>(); String query = "SELECT * FROM Shoes WHERE Brand LIKE " + brand + " ORDER BY Price ASC "; //query to get all the shoes for brand typed in SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setGender(cursor.getString(4)); item.setID(cursor.getString(5)); item.setSize("See Description"); shoeList.add(item); } while (cursor.moveToNext()); } return shoeList; } // Retrieves all outerwear items from the database public ArrayList<Item> getAllOuterwear() { ArrayList<Item> outerwearList = new ArrayList<Item>(); String query = "SELECT * FROM Outerwear ORDER BY Price ASC "; // query to get all outerwear items SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); outerwearList.add(item); } while (cursor.moveToNext()); } return outerwearList; } // Retrieves all outerwear items of specified brand typed into the search bar public ArrayList<Item> getAllSearchedOuterwear(String brand) { brand = "\\"" + brand + "\\""; ArrayList<Item> outerwearList = new ArrayList<Item>(); String query = "SELECT * FROM Outerwear WHERE Brand LIKE " + brand + " ORDER BY Price ASC "; //query to get all the outerwear for brand typed in SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); outerwearList.add(item); } while (cursor.moveToNext()); } return outerwearList; } // Retrieves all the items in the cart public ArrayList<Item> getItemsInCart() { ArrayList<Item> cartList = new ArrayList<Item>(); String query = "SELECT * FROM " + shoppingCartTable + " ORDER BY Price ASC"; // query to get all the items in the cart SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()){ do { Item item = new Item(); item.setBrand(cursor.getString(0)); item.setStore(cursor.getString(1)); item.setPrice(cursor.getString(2)); item.setDescription(cursor.getString(3)); item.setSize(cursor.getString(4)); item.setGender(cursor.getString(5)); item.setID(cursor.getString(6)); cartList.add(item); } while (cursor.moveToNext()); } return cartList; } // Adds the item chosen from the listView to your shopping cart. public void addToCart(Item item) { String description = item.getDescription(); description = description.replaceAll("\\"", " inch"); String brand = item.getBrand(); description = "\\"" + description + "\\""; brand = "\\"" + brand + "\\""; String query = "INSERT INTO " + shoppingCartTable + " (Brand, Store, Price, Description, Size, Gender, ID) " + "VALUES (" + brand + ", '" + item.getStore() + "', '" + item.getPrice() + "', " + description + ", '" + item.getSize() + "', '" + item.getGender() + "', '" + item.getID() + "')"; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(query); } // Deletes the item from the shopping cart public void deleteItemFromCart(String ID) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(shoppingCartTable, " ID = '" + ID + "'", null); } // Returns total price of items in shopping cart public String getTotalCartPrice() { String SQLQuery = "SELECT SUM(Price) FROM OPS_insert"; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(SQLQuery, null); c.moveToFirst(); String priceTotal = c.getString(0); return priceTotal; } public void setLimitPants(String startSize, String currentSize, String limit) { String SQLQuery = "UPDATE setLimitPants SET startingSize = '" + startSize + "', currentSize = '" + currentSize + "', limitSize = '" + limit + "'"; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(SQLQuery); } public String getLimit(String tableName) { String SQLQuery = "SELECT limitSize FROM " + tableName; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(SQLQuery, null); c.moveToFirst(); String limit = c.getString(0); return limit; } public void setLimitShirts(String startSize, String currentSize, String limit) { String SQLQuery = "UPDATE setLimitShirts SET startingSize = '" + startSize + "', currentSize = '" + currentSize + "', limitSize = '" + limit + "'"; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(SQLQuery); } public String getStartSizePants() { String SQLQuery = "SELECT startingSize FROM setLimitPants"; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(SQLQuery, null); c.moveToFirst(); String startingSize = c.getString(0); return startingSize; } public String getStartSizeShirts() { String SQLQuery = "SELECT startingSize FROM setLimitShirts"; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(SQLQuery, null); c.moveToFirst(); String startingSize = c.getString(0); return startingSize; } public String getCurrentShirtSize() { String SQLQuery = "SELECT currentSize FROM setLimitShirts"; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(SQLQuery, null); c.moveToFirst(); String currentSize = c.getString(0); return currentSize; } public String getCurrentPantsSize() { String SQLQuery = "SELECT currentSize FROM setLimitPants"; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(SQLQuery, null); c.moveToFirst(); String currentSize = c.getString(0); return currentSize; } public void updateSizeShirts(String newSize) { String SQLQuery = "UPDATE setLimitShirts SET currentSize = '" + newSize + "'"; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(SQLQuery); } public void updateSizePants(String newSize) { String SQLQuery = "UPDATE setLimitPants SET currentSize = '" + newSize + "'"; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(SQLQuery); } public void removeLImit(String tableName) { String SQLQuery = "UPDATE " + tableName + " SET startingSize = 'null', currentSize = 'null', limitSize = 'null'"; SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(SQLQuery); } /*** * Open database * @throws android.database.SQLException */ public void openDataBase() throws SQLException { String myPath = DB_PATH + DB_NAME; myDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } /** * Copy database from source code assets to device * @throws java.io.IOException */ public void copyDataBase() throws IOException { try { InputStream myInput = context.getAssets().open(DB_NAME); String outputFileName = DB_PATH + DB_NAME; OutputStream myOutput = new FileOutputStream(outputFileName); byte[] buffer = new byte[1024]; int length; while((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } catch (Exception e) { Log.e("tle99 - copyDatabase", e.getMessage()); } } /*** * Check if the database doesn't exist on device, create new one * @throws IOException */ public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { } else { this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { Log.e("tle99 - create", e.getMessage()); } } } // --------------------------------------------- // PRIVATE METHODS // --------------------------------------------- /*** * Check if the database is exist on device or not * @return */ private boolean checkDataBase() { SQLiteDatabase tempDB = null; try { String myPath = DB_PATH + DB_NAME; tempDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } catch (SQLiteException e) { Log.e("tle99 - check", e.getMessage()); } if (tempDB != null) tempDB.close(); return tempDB != null ? true : false; } } 

CartItemsAdapter.java

 package ankitkaushal.app.healthysizing; import java.util.ArrayList; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public final class CartItemsAdapter extends ArrayAdapter<Item> implements View.OnClickListener { public CartItemsAdapter(Context context, ArrayList<Item> shirtItems) { super(context, 0, shirtItems); } @Override public View getView(final int position, View convertView, ViewGroup parent) { // Get the data item for this position Item item = getItem(position); // Check if an existing view is being reused, otherwise inflate the view if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.cart_layout, parent, false); } // Lookup view for data population TextView brand = (TextView) convertView.findViewById(R.id.txt_cart_brand); TextView price = (TextView) convertView.findViewById(R.id.txt_cart_price); TextView store = (TextView) convertView.findViewById(R.id.txt_cart_store); TextView size = (TextView) convertView.findViewById(R.id.txt_cart_size); TextView description = (TextView) convertView.findViewById(R.id.txt_cart_description); ImageView shirtsImage = (ImageView) convertView.findViewById(R.id.image_view_cart); Button deleteFromCartButton = (Button) convertView.findViewById(R.id.deleteItemButton); // Populate the data into the template view using the data object brand.setText("Brand:" + " " + item.getBrand()); price.setText("Price:" + " $" + item.getPrice()); store.setText("Store:" + " " + item.getStore()); size.setText("Size:" + " " + item.getSize()); description.setText("Description:" + " " + item.getDescription()); Context context = parent.getContext(); try { // Find the image name from database ID column and link that up with the name of image in drawable folder String itemName = item.getID(); String uri = "@drawable/"+itemName; int imageResource = context.getResources().getIdentifier(uri, null, context.getApplicationContext().getPackageName()); Drawable drawable = context.getResources().getDrawable(imageResource); shirtsImage.setImageDrawable(drawable); } catch (Exception e) { // If no image found for item, just set the image to a default image in drawable folder // TODO Auto-generated catch block Drawable drawable = context.getResources().getDrawable(R.drawable.shirts); // Default image shirtsImage.setImageDrawable(drawable); } deleteFromCartButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // To get the item from the listView for which the Add to Cart button is pressed Item item = getItem(position); // Delete the item from the cart by pressing the delete item button DatabaseHelper db = new DatabaseHelper(getContext()); db.deleteItemFromCart(item.getID()); remove(item); // Update the listView to reflect the changes notifyDataSetChanged(); } }); // Return the completed view to render on screen return convertView; } @Override public void onClick(View v) { // TODO Auto-generated method stub } } 

shoppingCart.java

 package ankitkaushal.app.healthysizing; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import java.io.IOException; import java.util.ArrayList; public class shoppingCart extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shopping_cart); final DatabaseHelper dbhelper; final ListView listView; final ListAdapter cartAdapter; dbhelper = new DatabaseHelper(getApplicationContext()); try { dbhelper.createDataBase(); } catch (IOException e) { e.printStackTrace(); } listView = (ListView) findViewById(R.id.itemsInCartList); ArrayList<Item> cartList = dbhelper.getItemsInCart(); if (cartList != null) { cartAdapter = new CartItemsAdapter(getApplicationContext(), cartList); listView.setAdapter(cartAdapter); } listView.setEmptyView(findViewById(R.id.emptyCartMessage)); TextView displayTotalPrice = (TextView) findViewById(R.id.totalCartPrice); String totalCartPrice = dbhelper.getTotalCartPrice(); if (totalCartPrice != null) { displayTotalPrice.setText("Total Price: $" + totalCartPrice); } else { displayTotalPrice.setText("Total Price: $0.00"); } } } 

In my opinion, the fastest way is:

  1. create: OnItemDeletedListener.java

OnItemDeletedListener.java

public interface OnItemDeletedListener {
    public void onItemDeleted();
}
  1. in your CartItemsAdapter add following code:

     private OnItemDeletedListener onItemDeletedListener; public void setOnItemDeletedListener(Object object) { onItemDeletedListener = (OnItemDeletedListener) object; } 
  2. In function getView(...) replace setOnClickListener with this:

     deleteFromCartButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // To get the item from the listView for which the Add to Cart button is pressed Item item = getItem(position); // Delete the item from the cart by pressing the delete item button DatabaseHelper db = new DatabaseHelper(getContext()); db.deleteItemFromCart(item.getID()); remove(item); // Update the listView to reflect the changes notifyDataSetChanged(); onItemDeletedListener.onItemDeleted(); } 
  3. Change shoppingCart class:

shoppingCart.java

package ankitkaushal.app.healthysizing;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.io.IOException;
import java.util.ArrayList;

 public class shoppingCart extends ActionBarActivity implements OnItemDeletedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shopping_cart);

        final DatabaseHelper dbhelper;
        final ListView listView;
        final ListAdapter cartAdapter;

        dbhelper = new DatabaseHelper(getApplicationContext());
        try {
            dbhelper.createDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }

        listView = (ListView) findViewById(R.id.itemsInCartList);
        ArrayList<Item> cartList = dbhelper.getItemsInCart();

        if (cartList != null) {
            cartAdapter = new CartItemsAdapter(getApplicationContext(), cartList);
            cartAdapter.setOnItemDeletedListener(this);
            listView.setAdapter(cartAdapter);
        }

        listView.setEmptyView(findViewById(R.id.emptyCartMessage));

        displayTotalPrice();
    }

    private void displayTotalPrice() {

        TextView displayTotalPrice = (TextView) findViewById(R.id.totalCartPrice);
        String totalCartPrice = dbhelper.getTotalCartPrice();

        if (totalCartPrice != null) {
            displayTotalPrice.setText("Total Price: $" + totalCartPrice);
        }

        else {
            displayTotalPrice.setText("Total Price: $0.00");
        }
    }

    @Override
    public void onItemDeleted() {
        displayTotalPrice();
    }
}

[EDIT]

Replace final ListAdapter cartAdapter; with final CartItemsAdapter cartAdapter;

It seems like you don't notify displayTotalPrice when you click the delete button (if this is the TextView that you want to update when you delete an item from your cart). Your activity should listen to the changes made in your CartItemsAdapter.

Add this inner interface to your CartItemsAdapter.

public static interface ItemDeleteListener {
    public void onItemDelete(double price);
}

Then make a reference to this interface inside of your CartItemsAdapter:

ItemDeleteListener itemDeleteListener;

This variable should be initialized when you're creating new CartItemsAdapter (pass it as an argument):

// 'this' in this case is your Activity passed into Adapter as an argument
cartAdapter = new CartItemsAdapter(getApplicationContext(), cartList, this);

In your CartItemsAdapter constructor then initialize that interface:

this.itemDeleteListener = listener;

Then let your shopping cart Activity implement this interface:

public class shoppingCart extends ActionBarActivity implements CartItemsAdapter.ItemDeleteListener {
    ...
    @Override
    public void onItemDelete(doublePrice) {

        // here you notify displayTotalPrice, doublePrice should be total price
        displayTotalPrice.setText(doublePrice);

        }
}

When change happens, invoke it in your CartItemsAdapter like this:

itemDeleteListener.onItemDelete(db.getTotalCartPrice());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM