UPDATE:
latest update - getChanges() method has been added.
second update - I have added the whole of my ShoppingList.java class.
first update - After 2 people liking the question but no answers, I have opened up a bounty for this question.
Question:
I have had similar issues to this where I am unable to to re-filter my ListView once I start a new intent and then return back to the original page. This was solved with the use of an overiding the onResume() method and recalling my filter code from another filter method.
The latest issue Im having is should a dialogBuilder or a toast message be used on my app page, then once again the filter text is blanked i.e any text entered into my filter EditText is ignored by my filter.
Here are some screenshots to highlight the issue:
Loaded ListView of the items:
A search term is entered into the filter EditText and filter correctly:
The first item 'A' is edited to 'AB'. The toast message confirms the action:
This is the issue, the dialogbuilder(which is how the item is edited) and toast message are complete, a new filter term is entered into the EditText and the filter no longer filters:
Here is my filter code:
package com.example.flybaseapp;
public class ShoppingList extends ListActivity implements OnClickListener {
Button AddItem;
Button showShop;
ListView showItems;
SimpleCursorAdapter cursorAdapter;
Long itemId;
TextView totalPrice;
String itemDescription;
int itemAmount;
int itemPrice;
EditText itemNameEdit;
DBHandlerShop getCons;
Dialog e1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shoppinglistlayout);
AddItem = (Button) findViewById(R.id.btnAddItem);
showShop = (Button) findViewById(R.id.btnSearchShops);
showItems = (ListView) findViewById(android.R.id.list);
totalPrice = (TextView) findViewById(R.id.totalListPrice);
AddItem.setOnClickListener(this);
showShop.setOnClickListener(this);
setList();
int setPrice = updateTotal();
totalPrice.setText(Integer.toString(setPrice));
itemNameEdit = (EditText) findViewById(R.id.inputItemName);
showItems.setTextFilterEnabled(true);
itemNameEdit.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
cursorAdapter.getFilter().filter(s.toString());
showItems.refreshDrawableState();
}
});
getCons = new DBHandlerShop(this, null, null);
getCons.open();
cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
return getCons.getChanges((constraint.toString()));
}
});
showItems.setAdapter(cursorAdapter);
}
@Override
public void onClick(View clickedAdd) {
switch (clickedAdd.getId()) {
case (R.id.btnAddItem):
show();
break;
case (R.id.btnSearchShops):
Intent checkGPS = new Intent("com.example.flybaseapp.CheckGPS");
startActivity(checkGPS);
break;
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long idd) {
super.onListItemClick(l, v, position, idd);
itemId = idd;
final CharSequence[] items = { "Edit Item", "Delete Item" };
Builder alertDialogBuilder = new AlertDialog.Builder(ShoppingList.this);
alertDialogBuilder.setTitle("Item Options:");
alertDialogBuilder.setItems(items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals("Edit Item")) {
AlertDialog.Builder builder = new AlertDialog.Builder(
ShoppingList.this);
builder.setTitle("Edit Item");
DBHandlerShop setEdit = new DBHandlerShop(
ShoppingList.this, null, null);
setEdit.open();
String itemName = setEdit.getItem(itemId);
int itemAmount = setEdit.getItemQuan(itemId);
int itemPrice = setEdit.getItemCost(itemId);
setEdit.close();
LinearLayout layout = new LinearLayout(
ShoppingList.this);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText titleBox = new EditText(
ShoppingList.this);
titleBox.setText(itemName);
titleBox.setHint("Item Name:");
layout.addView(titleBox);
final EditText quantityBox = new EditText(
ShoppingList.this);
quantityBox.setText(Integer.toString(itemAmount));
quantityBox.setHint("Item Quantity");
layout.addView(quantityBox);
final EditText priceBox = new EditText(
ShoppingList.this);
priceBox.setText(Integer.toString(itemPrice));
priceBox.setHint("Item Price.");
layout.addView(priceBox);
builder.setView(layout);
builder.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int whichButton) {
Editable valueItem = titleBox
.getText();
Editable valueAmount = quantityBox
.getText();
Editable valuePrice = priceBox
.getText();
String itemDescription = valueItem
.toString();
String s = valueAmount.toString();
int itemAmount = Integer
.parseInt(s);
String a = valuePrice.toString();
int itemPrice = Integer.parseInt(a);
try {
DBHandlerShop update = new DBHandlerShop(
ShoppingList.this,
null, null);
int totalCombined = itemAmount
* itemPrice;
update.open();
update.updateItem(itemId,
itemDescription,
itemAmount, itemPrice);
update.close();
int setPrice = updateTotal();
totalPrice.setText(Integer
.toString(setPrice));
} catch (Exception e) {
Toast.makeText(
getApplicationContext(),
"Items not updated.",
Toast.LENGTH_SHORT)
.show();
} finally {
Toast.makeText(
getApplicationContext(),
"Items updated.",
Toast.LENGTH_SHORT)
.show();
setList();
}
}
});
builder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int whichButton) {
}
});
builder.show();
}
else if (items[item].equals("Delete Item")) {
try {
DBHandlerShop delete = new DBHandlerShop(
ShoppingList.this, null, null);
delete.open();
delete.deleteItem(itemId);
delete.close();
DBHandlerShop findPrice = new DBHandlerShop(
ShoppingList.this, null, null);
findPrice.open();
int returnedCost = findPrice
.getItemCost(itemId);
findPrice.close();
int cost = updateTotal();
int newTotal = cost - returnedCost;
totalPrice.setText(Integer.toString(newTotal));
}
catch (Exception e) {
Toast.makeText(getApplicationContext(),
"Item failed to be deleted.",
Toast.LENGTH_SHORT).show();
}
finally {
Toast.makeText(getApplicationContext(),
"Item deleted from the list.",
Toast.LENGTH_SHORT).show();
setList();
}
}
}
});
alertDialogBuilder.show();
}
@SuppressWarnings("deprecation")
private void setList() {
DBHandlerShop DBShop = new DBHandlerShop(this, null, null);
DBHandlerShop searchItems = new DBHandlerShop(this, null, null);
searchItems.open();
Cursor cursor = searchItems.getItems();
startManagingCursor(cursor);
searchItems.close();
String[] from = new String[] { DBShop.KEY_ITEMSHOP, DBShop.KEY_ITEMNUM,
DBShop.KEY_ITEMPRICE };
int[] to = new int[] { R.id.txtSetItem, R.id.txtSetAmount,
R.id.txtSetPrice };
cursorAdapter = new SimpleCursorAdapter(this, R.layout.setshoppinglist,
cursor, from, to);
showItems.setAdapter(cursorAdapter);
}
private int updateTotal() {
DBHandlerShop total = new DBHandlerShop(this, null, null);
int totalPrice = 0;
total.open();
Cursor totalPrices = total.getTotals();
total.close();
if (totalPrices != null) {
startManagingCursor(totalPrices);
if (totalPrices.moveToFirst()) {
do {
int cost = totalPrices.getInt(3);
int amount = totalPrices.getInt(2);
int totalCost = cost * amount;
totalPrice += totalCost;
} while (totalPrices.moveToNext());
return totalPrice;
}
}
else {
return totalPrice;
}
return 0;
}
private void show() {
AlertDialog.Builder builder = new AlertDialog.Builder(ShoppingList.this);
builder.setTitle("Enter Item Details:");
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText titleBox = new EditText(this);
titleBox.setHint("Item Name:");
layout.addView(titleBox);
final EditText quantityBox = new EditText(this);
quantityBox.setHint("Item Quantity");
layout.addView(quantityBox);
final EditText priceBox = new EditText(this);
priceBox.setHint("Item Price.");
layout.addView(priceBox);
builder.setView(layout);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
try {
Editable valueItem = titleBox.getText();
Editable valueAmount = quantityBox.getText();
Editable valuePrice = priceBox.getText();
itemDescription = valueItem.toString();
String s = valueAmount.toString();
itemAmount = Integer.parseInt(s);
String a = valuePrice.toString();
itemPrice = Integer.parseInt(a);
DBHandlerShop addItem = new DBHandlerShop(
ShoppingList.this, null, null);
addItem.open();
addItem.insertItems(itemDescription, itemAmount, itemPrice);
addItem.close();
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
"Item failed to be added", Toast.LENGTH_SHORT)
.show();
} finally {
Toast.makeText(getApplicationContext(),
"Item added to your list", Toast.LENGTH_SHORT)
.show();
int cost = updateTotal();
totalPrice.setText(Integer.toString(cost));
setList();
}
}
});
builder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
});
builder.show();
}
@Override
protected void onResume() {
super.onResume();
setList();
showItems.setTextFilterEnabled(true);
itemNameEdit.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
cursorAdapter.getFilter().filter(s.toString());
showItems.refreshDrawableState();
}
});
getCons = new DBHandlerShop(this, null, null);
getCons.open();
cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
return getCons.getChanges((constraint.toString()));
}
});
showItems.setAdapter(cursorAdapter);
}
}
getChanges() from the Database Handler class:
public Cursor getChanges(String constraintPassed) {
String [] columns = new String[]{KEY_ROWSHOPID, KEY_ITEMSHOP, KEY_ITEMNUM, KEY_ITEMPRICE};
Cursor c = null;
if(constraintPassed.equals(""))
{
c = ourDatabase.query(DATABASE_TABLESHOP, columns, null, null, null, null, null);
}
else
{
c = ourDatabase.query(DATABASE_TABLESHOP, columns, KEY_ITEMSHOP + " LIKE'" + constraintPassed + "%'", null, null, null, KEY_ITEMSHOP + " ASC", null);
}
if( c != null)
{
c.moveToFirst();
}
return c;
}
Do I need to implement a life-cycle method once the edit has been made? If so could someone push me in the right direction of which is needed as I have tried onResume() and onRestart() to no avail.
Try calling notifyDataSetChanged()
on your Adapter after you update the filter. This should notify the ListView
that it needs to refresh its data also.
As far as I can see, you are running getCons.open();
multiple times without closing it or so in between. I don't know whether that open()
method ignores multiple calls or calling it multiple times causes an error, but you might want to try whether you can fix it by moving getCons.open();
directly below getCons = new DBHandlerShop(this, null, null);
.
A simple way around this issue I have found, is to simply recall the class by initiating a new intent object after the edit it complete. This still makes the overall operation of the process smooth and quick, and of course allows me to filter after an edit. So for the time being guys this is how Im going to go with it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With