Autore Topic: Scroll ListView molto lento  (Letto 1049 volte)

Offline yagamiraito

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5500 corby
  • Sistema operativo:
    Windows 7
Scroll ListView molto lento
« il: 07 Giugno 2012, 08:58:30 CEST »
0
Ho un problema con una listview.
La listView deve aggiornarsi ogni minuto.
Per aggiornarsi deve connettersi a un database dal quale ottiene la lista degli elementi da visualizzare.
Ogni elemento della lista è composto da un ImageView, due TextView e da 1,2 o 3 iconcine.
Quando ci sono un po' di elementi (una ventina) lo scroll molto molto lento.

Nell'OnCreate faccio partire un TimerTask che ogni X secondi fa il refresh della lista.
Nella classe che implementa TimerTask

Codice (Java): [Seleziona]
public void run()
{
        runOnUiThread(new Runnable()
        {
                public void run()
                {
                        loadList();
                }
        });
}


Nell'activity:
Codice (Java): [Seleziona]
private ArrayList<Buddy> personList;
protected ListView personListView;
private ArrayList<HashMap<String, Object>> data;

Nel OnCreate:
personListView = ((ListView)findViewById(R.id.personListView));
data=new ArrayList<HashMap<String,Object>>();
startTimerTask();


Metodo per caricare la lista:
Codice (Java): [Seleziona]
private synchronized void loadUsersList()
{
                       
        personList= Session.getDbInteraction().getList();
                               
        data.clear();
                       
        for(User user : personList)            
        {
                               
                HashMap<String,Object> personMap=new HashMap<String, Object>();
                personMap.put("image",GUIUtility.getIconToUse());
                // mette flag1 2 o 3
                GUIUtility.getLanguageToUse(user.getLanguage(), personMap);
                personMap.put("name", username);
                personMap.put("status", stato);
                data.add(personMap);    
        }
       
        String[] from={"image","name","status","flag1","flag2","flag3"};
        int[] to={R.id.personImage,R.id.personName,R.id.personState,R.id.flag1Image,R.id.flag2Image,R.id.flag3Image};
       
        adapter=new SimpleAdapter( getApplicationContext(),
                                   data,
                                   R.layout.person_item,
                                   from,
                                   to);
                               
                               
        personListView.setAdapter(adapter);
        registerForContextMenu(personListView);                        
}
               


Inizialmente avevo provato a utilizzare Asynctask ma il risultato era identico.
Cosa sto sbagliando? E' possibile sia così lento? Cosa lo fa rallentare così tanto?



Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Scroll ListView molto lento
« Risposta #1 il: 07 Giugno 2012, 09:09:30 CEST »
0
Se hai i tuoi dati dentro un ArrayList perchè non usi un ArrayAdapter?
Eviteresti l'overhead (in tempo e memoria) di dover creare l'hashmap.


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Scroll ListView molto lento
« Risposta #2 il: 07 Giugno 2012, 12:27:28 CEST »
0
Forse mi sfugge qualcosa, ma la lentezza dello scroll non dovrebbe dipendere dal tempo che impieghi ad aggiornare la lista, a meno che la CPU non sia costantemente impegnata a farlo. Prova ad allungare il periodo di aggiornamento a un'ora (per essere sicuro che lo faccia una sola volta) e vedi come si comporta. Se lo scroll continua ad essere lento, il problema è altrove. Una delle possibili cause è il fatto che le icone siano in realtà enormi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline yagamiraito

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung I5500 corby
  • Sistema operativo:
    Windows 7
Re:Scroll ListView molto lento
« Risposta #3 il: 07 Giugno 2012, 14:58:34 CEST »
0
Ho riprovato non in debug e in effetti lo scroll si blocca solo nel momento in cui viene fatto il refresh.
Non c'è modo di evitare questo?

Ho cercato come utilizzare ArrayAdapter ma non mi è molto chiaro
per usare l'ArrayAdapter estendo ListActivity.
e poi faccio un setAdapter(adapter)
Quello che non ho capito è cosa mettere dentro l'adapter
nel mio codice diventerebbe:
ArrayAdapter arrayAdapter = new ArrayAdapter(this,R.layout.person_item, ??????);


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Scroll ListView molto lento
« Risposta #5 il: 07 Giugno 2012, 15:47:00 CEST »
+1
Ho riprovato non in debug e in effetti lo scroll si blocca solo nel momento in cui viene fatto il refresh.
Non c'è modo di evitare questo?

Un metodo per affrontare queste problematiche sarebbe fare un po' profiling con TRACEVIEW, se hai un minimo di praticità con Eclipse. Per scoprire dove è che viene persa gran parte del tempo nei refresh.

Oppure adottare qualche pratica standard, tipo evitare di creare nuovi oggetti. Esempio, l'adapter non serve che lo ricrei da capo ogni volta, basta modificare la base dati e poi notificare all'adapter che è cambiata.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store