2013-09-04 18 views
5

Próbuję zmienić zawartość listy w Androidzie. Potem chcę, aby lista została przerysowana. Niestety elementy listy zmieniają się, ale stare elementy są wyświetlane w tle. Jeśli na nowej liście jest mniej elementów, wydaje się, że stare elementy wciąż są częścią listy, ponieważ są nadal wyświetlane, nawet jeśli nie można ich kliknąć. Jeśli wyskoczę z aplikacji za pomocą Menedżera zadań Android, a następnie ponownie otwórz aplikację, lista zostanie wyświetlona poprawnie! Dlatego myślę, że to musi być problem z odświeżaniem.Android Listview zachowuje stare elementy po zmianie adaptera.

Jak mogę starać się to osiągnąć:

Jak kompletnych zmian zawartości utworzyć nowy adapter, że przechodzi na ListView. W moim kodzie "ulubione" to nowa tablica, którą przekazuję do adaptera. Próbuję również wyczyścić listę i unieważnić ją. Wszystko to dzieje się w wątku UI (onPostExecute z 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(); 

Klarowny metoda adaptera:

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

Jak widać Próbowałem wszystkich rozwiązań podobnych problemów ją na stackoverflow . Niestety nic nie działało ...

Z góry dziękuję za wszelkie pomysły, jak rozwiązać ten problem.

Edit:

Próbowałem również ustawić wartość null adaptera przed przekazaniem nowego, również bez skutku. .setAdapter (null);

Jeśli otworzę klawiaturę, klikając przycisk editText, ekran zostanie odświeżony, a lista wyświetli się poprawnie.

Odpowiedz

2

Czy próbowałeś już myList.setAdapter(null);?

+1

Próbowałem tego, niestety, bez efektu. – AndroidDev23

+0

czy to w końcu rozwiązanie? Nie działa dla mnie i mam ten sam problem. – mikus

1

Najpierw wyczyść dane. Myślę, że to jest favorites lub items lub cokolwiek innego. i powiadom adapter w ten sposób.

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

Już to robię, nie ma to żadnego efektu. – AndroidDev23

1

I rozwiązać problem poprzez wypełnienie pozostałej przestrzeni pod listą z układem z bardziej layout_weight niż ListView. W ten sposób "dodatkowe" linie są ukryte.

<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

To zadziałało idealnie, wydaje się, że Android nie czyści prawidłowo "śmieci" po zmniejszeniu kontroli. Cokolwiek w nim było, ale teraz jest poza jego pobytem, ​​dopóki nie zostanie objęte czymś innym. Rozwijany pojemnik wykonuje zadanie – mikus

0

Próbowałem tego i odkryłem, że HardwareAcceleration musi być ustawione na TRUE (co jest również wartością domyślną) w znaczniku aplikacji w pliku manifestu. W przeciwnym razie listView będzie przechowywać stare nieklikalne elementy w tle podczas pisania.

android:hardwareAccelerated="true"