Tengo una aplicación en el mercado con un error que parece que no puedo resolver. Hoy lo he seguido hasta el siguiente método.ListView vacío a pesar de los elementos agregados al adaptador en algún momento al reanudar la aplicación
public void updateDealList(ArrayList<Deal> deals) {
// first call or showing bookmakrs (also gets called other times when adapter is null)
if (dealListAdapter == null || showingBookmarks || !dealListAdapter.moreDealsToDownload()) {
dealListAdapter = new EndlessDealListAdapter(getActivity(),
R.layout.deal_list_item, deals);
setListAdapter(dealListAdapter);
listView = getListView();
if (getActivity().findViewById(R.id.right_fragment_container)!=null){ // if tablet
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);
}
showingBookmarks=false;
Log.d("UPDATE_DEAL_LIST", "Notified list created new" + dealListAdapter.getCount());
return; //PROBLEM OCCURS WHEN APP COMES IN HERE AFTER RESUMING
}
dealListAdapter.getDealListAdapter().clear();
for (Deal d: deals){
dealListAdapter.getDealListAdapter().add(d);
Log.d("UPDATE_DEAL_LIST", "added " + d.title);
}
dealListAdapter.notifyDataSetChanged();
Log.d("UPDATE_DEAL_LIST", "Notified list " + dealListAdapter.getCount());
}
Este método se pasa una matriz de objetos de negociación que se eliminan de Internet. Cuando se abre por primera vez la aplicación, los datos se extraen de Internet y se llama al método anterior, que crea un nuevo adaptador configurado para ListFragment. Este método también se llama cuando el usuario solicita más ofertas.
El problema que estoy teniendo es que la lista a veces piensa que está vacía a pesar del adaptador que contiene ofertas. Esto parece ocurrir cuando un uso reanuda la aplicación cuando su dispositivo tiene poca memoria (supongo que parte de la aplicación ha sido eliminada del RAM). Se llama a este método y dealListAdapter es nulo, por lo que se crea uno nuevo y se agregan ofertas. A pesar de esto, la lista permanece vacía y el usuario tiene que forzar el cierre de la aplicación para que funcione nuevamente.
La siguiente línea muestra tat cuando se llama el método ingresa el if y 21 ofertas se agregan al adaptador. Lamentablemente, la lista está vacía para el usuario.
05-23 01:52:32.879: D/UPDATE_DEAL_LIST(3478): Notified list created new21
Avíseme si hay algún código adicional que pueda ser útil. – bencallis
Después de crear el adaptador, lo borra y agrega todas las entradas de la matriz de ofertas. ¿Cómo está almacenando esta matriz? Si es una variable miembro de la clase, no se conservará si el sistema mata tu actividad. ¿Guarda el estado de la actividad cuando está en pausa o detenido? http://developer.android.com/guide/topics/fundamentals/activities.html#SavingActivityState –
Cuando está en el cuerpo if del método, vuelve al final para que el adaptador no se borre al instante. El adaptador se almacena como una variable de instancia en la clase ListFragment. ArrayList en sí mismo no se almacena, ya que cambia con frecuencia. Ningún estado está actualmente guardado. Parece que cuando la aplicación se inicia de nuevo después de ser asesinada se produce el problema. ¿Qué hace diferente a Android cuando relanza una aplicación después de que el sistema la mata, en lugar de iniciarla desde cero? – bencallis