Autore Topic: Semplice domanda sulle ListView  (Letto 402 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Semplice domanda sulle ListView
« il: 27 Febbraio 2015, 11:27:25 CET »
0
Salve a tutti!

Vorrei sapere una piccola cosa, le ListView hanno un limite di elementi che possono contenere?

A me è capitato che testando la ListView, scrollando la lista , arrivato ad un certo punto della lista l'app crasha (aveva 169 elementi), ho ripetuto la cosa (questa volta con 60 elementi) e l'app non è crashata.

Mi potete gentilmente illuminare?

Grazie mille!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Semplice domanda sulle ListView
« Risposta #1 il: 27 Febbraio 2015, 14:28:42 CET »
0
Beh, senza codice né logcat la domanda è troppo generica.
Detto così il problema sembrerebbe essere la memoria, la Listview cerca di "riciclare" le View per evitare di allocarne troppe, nella getView dell'Adapter dovresti riutilizzare quella che ti viene passata anziché fare l'inflate di una nuova. Lo fai?

Ciao.

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Semplice domanda sulle ListView
« Risposta #2 il: 27 Febbraio 2015, 14:52:23 CET »
0
Mi dispiace ma ovviamente siccome era un errore semplice lo ho già corretto, però in effetti il logcat mi dava un errore sulla memoria.

Qui è come riempio la mia ListView personalizzata:
Codice (Java): [Seleziona]
  ArrayList<User> arrayOfUsers= new ArrayList<User>();
        RistorantiUsersAdapter adapter2 = new RistorantiUsersAdapter(this, arrayOfUsers);

        for(int i=0;i<10;i++){
            User newUser = new User(Lingua.dbristoranteName[i],dist2[i]);
            adapter2.add(newUser);

        }

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowristoranti,
        R.id.Nome, Lingua.dbristoranteName);

        // Assign adapter to ListView
        listView.setAdapter(adapter2);

so che è poco però ti ringrazio tantissimo ^^ mi hai già chiarito un paio di cose!

Offline wlf

  • Utente normale
  • ***
  • Post: 359
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Semplice domanda sulle ListView
« Risposta #3 il: 27 Febbraio 2015, 17:27:25 CET »
0
E' molto chiara la spiegazione data da Arlabs, mi accodo facendo un altra semplice domanda.

Mettiamo che abbia la seguente situazione:

Codice: [Seleziona]
ListView listView = (ListView) findViewById(R.id.listView);
ArrayList<MyMov> myMov = new ArrayList<MyMov>();
...
valorizzo myMov
...
myAdapter = new MyAdapter(this, R.layout.riga_custom, myMov);
listView.setAdapter(myAdapter);

Nel caso che al mio ArrayList aggiungo degli elementi posso notificare al mio adapter che il dataset è cambiato, myAdapter.notifyDataSetChanged(), e la modifica mi viene visualizzata tranquillamente, se invece di aggiungere dati lo inizializzo e rigenero il myAdapter.notifyDataSetChanged() non mi fa vedere alcunché.

Codice: [Seleziona]
myMov = new ArrayList<MyMov>();
...
aggiungo dei dati a myMov
...
myAdapter.notifyDataSetChanged()

Come mai? E' perché Java si tiene traccia per riferimento e quindi una nuova inizializzazione perde i riferimenti precedenti?