Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo parar toast & alertDialog perder el foco en mi filtro EditText

ACTUALIZAR:

Se ha agregado la última actualización – método getChanges ().

Segunda actualización – He agregado toda mi clase de ShoppingList.java.

Primera actualización – Después de 2 personas que gustan de la pregunta pero no hay respuestas, he abierto una recompensa por esta pregunta.

Pregunta:

He tenido problemas similares a este en el que no puedo volver a filtrar mi ListView una vez que inicie una nueva intención y luego volver a la página original. Esto se resolvió con el uso de un override el método onResume () y recuperar mi código de filtro de otro método de filtro.

El último problema que tengo es que un mensaje dialogBuilder o un mensaje de tostado se use en mi página de la aplicación, luego una vez más el texto del filtro se borra es decir, cualquier texto ingresado en mi filtro EditText es ignorado por mi filtro.

Aquí hay algunas capturas de pantalla para resaltar el problema:

Loaded ListView de los artículos:

Introduzca aquí la descripción de la imagen

Se introduce un término de búsqueda en el filtro EditText y se filtran correctamente:

Introduzca aquí la descripción de la imagen

El primer elemento 'A' se edita en 'AB'. El mensaje de brindis confirma la acción:

Introduzca aquí la descripción de la imagen

Este es el problema, el dialogbuilder (que es cómo se edita el elemento) y el mensaje tostado, se introduce un nuevo término de filtro en el EditText y el filtro ya no filtra:

Introduzca aquí la descripción de la imagen

Aquí está mi código de filtro:

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 () de la clase del controlador de base de datos:

 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; } 

¿Necesito implementar un método de ciclo de vida una vez hecha la edición? Si es así, alguien podría empujarme en la dirección correcta de la que es necesario, ya que he intentado onResume () y onRestart () sin éxito.

  • Cómo actualizar fragmento anterior después de cerrar una actividad que se inició dentro de un adaptador?
  • ¿Cómo puede un AsyncTask todavía utilizar una actividad si el usuario ya ha navegado lejos de ella?
  • JSON a clase Java
  • ¿Puede el nuevo constructor File () devolver null en Android?
  • Proceso de multi-subprocesos Java (Android)
  • ¿Cómo obtengo el tamaño del archivo de temp en android?
  • Archivos DDMS no encontrados Android \ platform-tools \ adb.exe
  • TagSoup vs Jsoup vs HTML Parser vs HotSax vs
  • 6 Solutions collect form web for “Cómo parar toast & alertDialog perder el foco en mi filtro EditText”

    Intente llamar a notifyDataSetChanged() en su adaptador después de actualizar el filtro. Esto debería notificar al ListView que necesita actualizar sus datos también.

    Por lo que puedo ver, estás ejecutando getCons.open(); Varias veces sin cerrarlo o así en el medio. No sé si ese método open() ignora múltiples llamadas o llamarlo varias veces causa un error, pero puede intentar si puede arreglarlo moviendo getCons.open(); Directamente debajo de getCons = new DBHandlerShop(this, null, null); .

    Una manera sencilla alrededor de este problema que he encontrado, es simplemente recordar la clase mediante la iniciación de un nuevo objeto de intención después de la edición que completa. Esto todavía hace el funcionamiento general del proceso liso y rápido, y por supuesto me permite filtrar después de una edición. Así que por ahora chicos esto es como voy a ir con él.

    Veo lo que está sucediendo en su caso. Cada vez que el usuario edita correctamente un elemento, ¡está configurando un nuevo adaptador a su lista! Y en su caso también, el TextWatcher añadido a su EditText en el método onCreate está usando el primer adaptador (en el método onTextChanged ) también creado en el método onCreate , la primera vez que se crea la actividad!

    Hay varias formas de resolver este problema. Una manera sería cambiar toda la forma en que implementó su actividad (yo personalmente no lo habría hecho de esta manera).

    Otra forma sería simplemente alterar el método setList , que se llama la primera vez en el método onCreate , y cada vez que el usuario edita correctamente un elemento. Esta es la solución que voy a explicar en detalle, ya que es rápido y fácil y no mucho tiempo para usted:

    • Si la lista no tiene un adaptador, cree uno.
    • Si la lista ya tiene un adaptador, simplemente cambie el cursor del adaptador y actualice la lista.

    Así que su método setList debería tener este aspecto:

     @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 }; // Check the cursor adapter is previously created if ( cursorAdapter == null ) { // There is no previous cursors, create a new one cursorAdapter = new SimpleCursorAdapter(this, R.layout.setshoppinglist, cursor, from, to); showItems.setAdapter(cursorAdapter); } else { // There is a previous adapter // Stop managing its cursor stopManagingCursor ( cursorAdapter.getCursor() ); // Assign the new cursor to the current adapter // The old cursor will be closed cursorAdapter.changeCursor ( cursor ); // No need to refresh the list, it will be automatically refreshed after the adapter's cursor is changed } } 

    De esta manera, el adaptador de la lista es el mismo que el TextWatcher está utilizando para filtrar la lista. Debe funcionar, intentarlo y hacerme saber lo que sucede.

    Creo que deberías usar

     android:hapticFeedbackEnabled="true" android:imeOptions="actionNext" android:nextFocusUp="@id/editeText1" android:nextFocusLeft="@id/edittextText" android:includeFontPadding="true" 

    Puedes probar por debajo de los cambios ..

    Después de mostrar sus elementos de brindis actualizados / borrados, llame a este mensaje

     cursorAdapter.notifyDataSetChanged(); 

    En su método setList () agregue lo siguiente ..

     cursorAdapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { super.onChanged(); setList(); }}); 

    Y mueva debajo del código a setList ()

     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())); } }); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.