- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 listView,它显示我现有数据库中购物车中的服装商品,并在底部显示我购物车中所有商品的总价。当我从购物车中删除商品时,listView 确实会更新,它会删除该商品,但当我删除该商品时,底部显示的总价不会更新,并且该总价仅来自对包含购物车中的商品的表执行 SUM(Price) 的查询。我在下面发布了我的一些代码,如果有人可以提供帮助,那就太好了。
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 = "AppDatabase";
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 the types of clothing items of the specified brand typed into the search bar
public ArrayList<Item> getAllSearchedItems(String brand, String table_name) {
ArrayList<Item> shirtList = new ArrayList<Item>();
String query = "SELECT * FROM " + table_name + " WHERE Brand LIKE '" + brand + "' ORDER BY Price ASC"; //query to get all the shirts 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));
shirtList.add(item);
} while (cursor.moveToNext());
}
return shirtList;
}
// Retrieves all the items of a certain type from the database
public ArrayList<Item> getAllItems(String table_name) {
ArrayList<Item> shirtList = new ArrayList<Item>();
String query = "SELECT * FROM " + table_name + " ORDER BY Price ASC"; //query to get all the shirts
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));
shirtList.add(item);
} while (cursor.moveToNext());
}
return shirtList;
}
// 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 + "\"";
String query = "INSERT INTO " + shoppingCartTable + " (Brand, Store, Price, Description, Size, Gender, ID) " +
"VALUES ('" + item.getBrand() + "', '" + 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 setLimitSize(String limit, String clothingType) {
String query = "UPDATE clothingLimit SET " + clothingType + " = " + limit;
}
/***
* 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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
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");
}
}
}
最佳答案
尝试将其从适配器移至 YourListView.onItemLongClickListener由此(在适配器类中)
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();
}
}
对此(在您的 Activity 中:
YourListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, final View view, int position, long l) {
// To get the item from the listView for which the Add to Cart button is pressed
Item item = YoutList.get(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();
TextView displayTotalPrice = (TextView) findViewById(R.id.totalCartPrice);
String totalCartPrice = dbhelper.getTotalCartPrice();
if (totalCartPrice != null) {
displayTotalPrice.setText("Total Price: $" + totalCartPrice);
}
}
});
关于java - 删除其中一项后,如何更新 ListView 中每一项的显示总价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783592/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!