Valores perdidos en la actividad anterior cuando hago clic en el botón, pero no cuando this.finish () se llama

Así que tengo un problema extraño. Tengo 2 Actividades en las que estoy trabajando. Una de las Actividades muestra un ListView cuyos datos son capturados a través de un Extra largo que utilizo para obtener los resultados a través de una cláusula WHERE en la base de datos.query. La otra Actividad se llama cuando se hace clic en un elemento ListView, lo que permite que alguien agregue algo a la base de datos para ListView.

Los nombres de las actividades son DaysActivity.java (la actividad con el listview) y DayAddActivity.java (la actividad que permite a alguien agregar un día, que luego aparece en el ListView de DaysActivity.java ).

El problema que tengo es, cuando finish() DayAddActivity.java que vuelve a DaysActivity y el ListView todavía está allí totalmente poblado. Sin embargo, si DayAddActivity.java el botón DayAddActivity.java en DayAddActivity.java (el botón a la izquierda del título en la barra de acción con el icono de mi aplicación), cuando vuelve a DaysActivity.java, el ListView está vacío / desaparecido.

Heres el código para ambos:

DaysActivity.java:

 package com.gauvion.gfit; import android.annotation.SuppressLint; import android.app.ListActivity; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.SimpleCursorAdapter; import android.widget.Toast; public class DaysActivity extends ListActivity { private DaysDataSource datasource; private SimpleCursorAdapter dataAdapter; private boolean isEditing = false; private Toast toast_deleted; private String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY }; private int[] to; private long routineDataID; private String routineDataName; @SuppressLint("ShowToast") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_days); routineDataID = getIntent().getLongExtra("routineDataID", 0); routineDataName = getIntent().getStringExtra("routineDataName"); setTitle(routineDataName); toast_deleted = Toast.makeText(this, "", Toast.LENGTH_SHORT); datasource = new DaysDataSource(this); datasource.open(); Cursor cursor = datasource.fetchAllDays(routineDataID); to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day }; dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0); setListAdapter(dataAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.activity_days, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Cursor cursor = datasource.fetchAllDays(routineDataID); switch (item.getItemId()) { case R.id.button_days_add: Intent startDayAdd = new Intent(this, DayAddActivity.class); startDayAdd.putExtra("routineDataID", routineDataID); this.startActivity(startDayAdd); return true; case R.id.button_days_edit: to = new int[] { R.id.listitem_day_edit_name, R.id.listitem_day_edit_day }; dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day_edit, cursor, columns, to, 0); setListAdapter(dataAdapter); isEditing = true; invalidateOptionsMenu(); return true; case R.id.button_days_edit_done: to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day }; dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0); setListAdapter(dataAdapter); isEditing = false; invalidateOptionsMenu(); return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.button_days_edit).setVisible(!isEditing); menu.findItem(R.id.button_days_edit_done).setVisible(isEditing); return true; } @Override protected void onResume() { datasource.open(); Cursor cursor = datasource.fetchAllDays(routineDataID); dataAdapter.changeCursor(cursor); super.onResume(); } @Override protected void onPause() { datasource.close(); super.onPause(); } } 

DayAddActivity.java:

 package com.gauvion.gfit; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import android.support.v4.app.NavUtils; public class DayAddActivity extends Activity { private RoutinesDataSource datasource; private EditText dayName; private Spinner dayDay; private Button saveButton; private long routineDataID; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_day_add); routineDataID = getIntent().getLongExtra("routineDataID", 0); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_day_add, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } public void cancelDay(View view) { this.finish(); } } 

La función cancelDay() se llama cuando se hace clic en un botón "Cancelar" en activity_day_add.xml . Como dije, cuando hago clic en el botón "Cancelar" dentro de DayAddActivity.java , vuelve a DaysActivity.java y el ListView está bien. Todos los datos están allí. Sin embargo, si presiono el botón Atrás en la barra de acción (el botón que contiene una flecha hacia atrás y el icono de mi aplicación junto al título de la actividad), el ListView para DaysActivity.java está vacío / desaparecido y el título también está vacío también se genera a través de un valor de cadena extra).

Sus cursores no son administrados por la actividad, esto puede causar una pérdida de memoria o incluso ANR. Debe considerar el uso de un cargador para rellenar una lista con un cursor. Puede encontrar un ejemplo aquí: http://developer.android.com/guide/components/loaders.html .

Los cargadores funcionan mejor ya que no congelan la aplicación cuando se obtiene la conexión a la base de datos y se pasan de una instancia de su actividad a otra, evitando pérdidas de memoria y reutilizando recursos.

Pero de nuevo, como en su post anterior: Extras parecen estar perdidos onResume () , usted debe entender el vínculo entre onSaveInstanceState y onCreate para pasar los argumentos al futuro yo de su actividad. Mira este post, la respuesta con la mayor puntuación: onSaveInstanceState () y onRestoreInstanceState () .

Parece que su Contexto tiene algunos problemas en "this.startActivity (startDayAdd);" línea. intente utilizar "DaysActivity.this.startActivity (startDayAdd);". si no funciona, use puntos de interrupción para ver la ejecución línea por línea.

  • Android getIntent () devuelve la primera intención
  • Usando la intención de llamar a un fragmento de otro fragmento
  • ¿Cómo establecer la acción, categoría y datos para la intención?
  • Principiante: usando variables definidas en una clase en otra clase
  • ¿Cómo encontrar Intent source en Android?
  • Cómo encontrar las intenciones "públicas" que podemos usar al usar otras aplicaciones en nuestras aplicaciones
  • Cómo devolver un resultado a través de múltiples actividades
  • Capturar / Interceptar los intentos de Android durante el tiempo de ejecución
  • Transmitir datos a onDestroy () de Service
  • Cómo obtener googlemaps para aceptar un archivo KML local?
  • Acceso directo para iniciar una actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.