2013-09-04 11 views
5

Ich versuche, den Inhalt eines Listview in Android zu ändern. Danach möchte ich, dass die Liste neu gezeichnet wird. Leider ändern sich die Listenelemente, aber die alten Elemente werden im Hintergrund angezeigt. Wenn in der neuen Liste weniger Elemente vorhanden sind, scheinen die alten Elemente immer noch Teil der Liste zu sein, da sie immer noch angezeigt werden, auch wenn sie nicht anklickbar sind. Wenn ich über den Android Taskmanager aus der App steige und danach die App wieder öffne, wird die Liste korrekt angezeigt! Daher denke ich, es muss ein Problem mit der Aktualisierung sein.Android Listview behält alte Elemente nach Adapteränderungen

Wie kann ich versuchen, es zu erreichen:

Da die kompletten Inhaltsänderungen ich erstellen Sie einen neuen Adapter, die ich an die Listview übergeben. In meinem Code "Favoriten" ist das neue Array, das ich an den Adapter übergebe. Ich versuche auch, die Liste zu löschen und ungültig zu machen.

all dies geschieht in dem UI-Thread (OnPostExecute von 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(); 

Die klare Methode des Adapters:

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

Wie Sie ich sie auf Stackoverflow alle Lösungen für ähnliche Probleme versucht sehen . Leider hat nichts funktioniert ...

Vielen Dank im Voraus für irgendwelche Ideen, wie man das löst.

Edit:

Ich habe auch versucht, den Adapter null, um den neuen, bevor er, auch ohne Wirkung. .setAdapter (null);

Auch wenn ich die Tastatur öffne, indem ich in einen editText klicke, wird der Bildschirm aktualisiert und die Liste wird korrekt angezeigt.

Antwort

2

Haben Sie versucht myList.setAdapter(null);?

+1

Ich habe das versucht, leider keinen Effekt. – AndroidDev23

+0

war es endlich die Lösung? Funktioniert nicht für mich und ich habe das gleiche Problem. – mikus

1

Zuerst löschen Sie die Daten. Ich denke, es ist favorites oder items oder was auch immer. und benachrichtige den Adapter auf diese Weise.

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

Ich mache das schon, es hat keinen Effekt. – AndroidDev23

1

löste ich das Problem, indem sie mit mehr layout_weight den verbleibenden Platz unter der Liste mit einem Layout Füllung als die ListView. Auf diese Weise sind die "Extra" -Linien verborgen.

<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

Dies funktionierte für mich perfekt, es scheint, dass Android den "Müll" nicht sauber säubert, nachdem die Kontrolle schrumpft. Also was auch immer drin war, aber jetzt draußen ist, bleibt dort, bis es von etwas anderem bedeckt ist. Expanding Container macht den Job – mikus

0

habe ich versucht, und ich entdeckte HardwareAcceleration eingestellt werden muss auf TRUE (was auch Standardwert ist) in Anwendung Tag in Ihrer Manifest-Datei. Andernfalls hält listView alte nicht anklickbare Elemente während der Eingabe im Hintergrund.

android:hardwareAccelerated="true" 
Verwandte Themen