2013-09-04 6 views
5

Provo a modificare il contenuto di un Listview in Android. Dopodiché voglio che la lista venga ridisegnata. Sfortunatamente gli elementi della lista cambiano, ma i vecchi elementi vengono visualizzati sullo sfondo. Se ci sono meno elementi nel nuovo elenco, sembra che i vecchi elementi facciano ancora parte dell'elenco, poiché sono ancora visualizzati, anche se non sono cliccabili. Se esco dall'app tramite Android Taskmanager e successivamente apro di nuovo l'app, l'elenco viene visualizzato correttamente! Quindi penso che debba essere un problema con l'aggiornamento.Android Listview conserva i vecchi oggetti dopo le modifiche dell'adattatore

Come posso provare a realizzarlo:

Come i cambiamenti di contenuto completo creo un nuovo adattatore che mi passa per la ListView. Nel mio codice "preferiti" è la nuova matrice che passo all'adattatore. Cerco anche di cancellare l'elenco e invalidarlo. tutto questo avviene nel thread UI (OnPostExecute di AsyncTask)

MyAdapter newAdapter = new MyAdapter(
      context, favorites); 
    MyAdapter current_adapter = (MyAdapter) myList.getAdapter(); 
    if((current_adapter!=null)){ 
    current_adapter.clear();} 

    myList.setAdapter(null); //inserted this because of answers, but with no effect. 
    myList.setAdapter(newAdapter); 
    myList.invalidateViews(); 

Il metodo chiaro dell'adattatore:

public void clear(){ 
    items.clear(); 
    notifyDataSetChanged(); 
    } 

Come potete vedere ho provato tutte le soluzioni a problemi simili a lei sul StackOverflow . Purtroppo non ha funzionato ...

Grazie in anticipo per qualsiasi idea su come risolvere questo problema.

Edit:

ho anche cercato di impostare il nulla 'adattatore prima di passare il nuovo, anche senza alcun effetto. . SetAdapter (null);

Anche se apro la tastiera facendo clic su un testo di modifica, la schermata si aggiorna e l'elenco viene visualizzato correttamente.

risposta

2

Hai provato myList.setAdapter(null);?

+1

Ho provato questo, purtroppo nessun effetto. – AndroidDev23

+0

è stata finalmente la soluzione? Non funziona per me e ho lo stesso problema. – mikus

1

Prima cancellare i dati. Penso che sia favorites o items o qualsiasi altra cosa. e avvisare l'adattatore in questo modo.

items.clear(); 
((MyAdapter) myList.getAdapter()).notifyDataSetChanged(); 
MyAdapter newAdapter = new MyAdapter(context, favorites); 
myList.setAdapter(newAdapter); 
myList.invalidate(); 
+0

Lo sto già facendo, non ha alcun effetto. – AndroidDev23

1

ho risolto il problema riempiendo lo spazio rimanente sotto l'elenco con un layout con più layout_weight del ListView. In questo modo le linee "extra" sono nascoste.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/transparent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/main_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 

    <LinearLayout 
     android:id="@+id/aux_layout" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="@color/transparent" 
     android:orientation="vertical" /> 

</LinearLayout> 
+0

Questo ha funzionato perfettamente per me, sembra che Android non stia pulendo correttamente la 'spazzatura' dopo che il controllo si restringe. Quindi qualsiasi cosa ci fosse dentro, ma ora è al di fuori delle sue permanenze fino a quando non viene coperta da qualcos'altro. Il contenitore espandibile fa il lavoro – mikus

0

ho provato e ho scoperto HardwareAcceleration deve essere impostato su TRUE (ciò che è anche il valore di default) in tag applicazione nel file manifest. Altrimenti listView manterrà vecchi elementi non cliccabili sullo sfondo durante la digitazione.

android:hardwareAccelerated="true"