Android listview desaparece después de la rotación de la pantalla

En mi diseño, tengo algunos botones para hacer algunas elecciones y luego un botón para realizar una consulta a una base de datos. El resultado de esta consulta se muestra en un ListView dentro de este diseño.

El problema es si después de realizar la consulta girar la pantalla, el ListView desaparece y tiene que realizar la consulta de nuevo.

Creo que esto está sucediendo porque la actividad se reinicia. Siguiendo las sugerencias aquí he añadido a mi actividad en el manifiesto android:configChanges="orientation|keyboardHidden" y en mi código añadido:

  @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.mylayout); } 

Pero esto no está funcionando.

Aquí está el código completo de mi actividad:

 public class MyClass extends ListActivity implements OnClickListener, OnCheckedChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.mylayout); // Creates the buttons and setOnClickListener and setOnCheckedChangeListener } @Override public void onClick(View v) { // Manages the buttons and their functions @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // See what group in radio group is checked } @Override protected void onListItemClick(ListView l, View v, int position, long id) { // After pressing one button, a query is made and a listview is shown. // This it to handle the user choice after he clicks an item on the listview } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.mylayout); } } 

Esto es extraño porque tengo otra actividad como esta:

 public class AtoZ extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.atoz); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); } } 

Esto también realiza una consulta a la base de datos, lo muestra en un ListView y luego se encarga de la elección del usuario. Si giro la pantalla, ListView sigue mostrando.

¿Que puedo hacer?

El ListView se vuelve a crear cuando se hace setContentView en el método onConfigurationChanged. Debe volver a cargar los datos en ListView. Si vincula el ListView a un adaptador, debe hacerlo en onConfigurationChanged.

Hay 2 cosas que pueden resolver sus problemas:

Solver A:

  1. Añadir android:configChanges="orientation|keyboardHidden" en el archivo xml de manifiesto .
  2. REMOVE onConfigurationChanged(Configuration newConfig) función.

Porque onCreate() se llama sólo una vez cada vez que se inicializa su Actividad. Mientras su onConfigurationChanged() vuelve a cargar e infla la nueva vista R.layout.mylayout con datos vacíos => su lista no se R.layout.mylayout con datos.

Solver B:

Mueva su código de enlace de datos que se había escrito en onCreate () con el método onStart() o onResume() . Le recomiendo que utilice onStart() para su caso de vinculación de datos.

Debe ver la página de desarrollo Android Activity life cycle

(Actualizar):

Debido a que cargas tu listContent al hacer clic en un botón de búsqueda en el elemento de lista, tienes que mantener los datos dentro de la actividad para reconstruir la lista de él (por ejemplo: una cadena de búsqueda). A continuación, en el onStart() reconstruir su lista de estos datos.

Sin embargo, es bastante extraño de su lógica al hacer clic en un elemento de la Lista para cambiar toda la Lista misma. Y observe que: onListItemClick(..) también se onListItemClick(..) cuando se hace clic en un botón del elemento de la lista.

Utilice configChanges en su actividad en el archivo de manifiesto.

 <activity ... ... android:configChanges="orientation|screenSize|keyboard"> </activity 

Esto funcionó para mí.

Debe reemplazar onSaveInstanceState y onRestoreInstanceState

En onSaveInstanceState guarde la lista ListView en el Bundle .

En onRestoreInstanceState , restaure la lista con el Bundle y onRestoreInstanceState crear el adaptador.

 private ArrayList<String> data; @Override protected void onSaveInstanceState(Bundle outState) { outState.putSerializable("d", data); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState != null) { data = (ArrayList<String>) savedInstanceState.getSerializable("d"); ListViewAdapter adapter = new ListViewAdapter(this, data); ListView listView = (ListView) findViewById(R.id.layout_listview); listView.setAdapter(adapter); } super.onRestoreInstanceState(savedInstanceState); } 

Tendrás que volver a hacer la consulta (si no la guardas) cuando haces un cambio de orientación, porque cuando esto se hace, oncreate se llama de nuevo.

Usted podría tratar de almacenar los datos que están en su listview, en algo como las preferencias compartidas.

  • ¿Cómo mostrar el número múltiple de TextViews dentro de cada fila en ListView?
  • Android set listview height dinámicamente
  • Android: No se puede obtener un encabezado / pie de lista ListView que se puede hacer clic
  • Android: Cómo crear CursorAdapter desde los datos en un archivo XML
  • No se puede encontrar el girador después de girar la pantalla
  • Cuando se desplaza un listview con un adaptador personalizado demasiado rápido arriba y abajo, getView () comienza a comportarse de manera extraña. ¿Por qué?
  • Filtrado SPINNER para los datos XML que se habían recuperado
  • Cambiar el color del fondo del elemento de lista activado en Honeycomb
  • uiautomator - no puede obtener ListView para desplazarse como validar el texto en cada elemento de la lista. sólo falla cuando golpeo el último elemento en la pantalla
  • Picasso no puede cargar imágenes para alguna URL (sin caracteres especiales)
  • ListView onScroll añadir más elementos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.