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.
- ListView en el widget agrega aleatoriamente los elementos en el desplazamiento y el cambio de tamaño (vistas remotas anidadas)
- ¿Cómo puedo evitar que el pie de página de ListView se seleccione?
- ¿Por qué Google utiliza Canvas en la vista de la lista de conversaciones de aplicaciones de Gmail?
- Activar onContextMenu cuando la detección de vínculo automático está presente
- Cursoradapter con diferentes diseños de filas
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?
- ¿Cómo implemento una lista seccionada en Android?
- Detectar qué elemento seleccionado (en un ListView) generó el ContextMenu (Android)
- Lista y lista de adaptadores para mostrar json
- Cómo ocultar un elemento en un listview en Android
- Android cómo hacer que resalte la vista cuando se hace clic?
- Vista de lista con la opción de actualización y supresión mediante contextmenu
- Quite el divisor inferior de un ListView de Android
- Picasso carga imágenes con una imagen errónea en un adaptador de lista
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:
- Añadir
android:configChanges="orientation|keyboardHidden"
en el archivo xml de manifiesto . - 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.
- SQLite rawQuery campos de selecciónArgs y enteros
- Porcentaje de color en Android para el diseño del material