Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to stop toast & alertDialog losing focus on my EditText filter

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:

enter image description here

A search term is entered into the filter EditText and filter correctly:

enter image description here

The first item 'A' is edited to 'AB'. The toast message confirms the action:

enter image description here

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:

enter image description here

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.

like image 219
user1352057 Avatar asked Mar 27 '13 12:03

user1352057


3 Answers

Try calling notifyDataSetChanged() on your Adapter after you update the filter. This should notify the ListView that it needs to refresh its data also.

like image 109
Thrakbad Avatar answered Oct 06 '22 12:10

Thrakbad


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);.

like image 30
thejh Avatar answered Oct 06 '22 14:10

thejh


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.

like image 44
user1352057 Avatar answered Oct 06 '22 13:10

user1352057