2012-11-13 21 views
7

Ich habe ein ListView mit einem benutzerdefinierten Adapter, der Informationen aus einer Datenbank anzeigt. Wenn ich die App starte, werden die Daten aus der Datenbank gelesen und an den Adapter übergeben, der dann an die ListView angehängt wird. Ein LayoutAnimationController wird auf dem ListView ausgeführt und zeigt den Inhalt problemlos an.Android Listview nicht aktualisieren

this._lvList = (ListView)_v.findViewById(R.id.lvList); 
    this._lvList.setAdapter(new TableAdapter(getActivity(),R.layout.tablerow,Category.getCategories())); 
    LayoutAnimationController lac = new LayoutAnimationController(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left)); 
    lac.setDelay(0.2f); 
    this._lvList.setLayoutAnimation(lac);  
    this._lvList.startLayoutAnimation(); 

Kein Problem.

Wenn ich jetzt auf einen Eintrag der ListView klicke, verschwinden die Einträge, auf die nicht geklickt wurde, der angeklickte Eintrag wird der einzige Eintrag in der Liste und wird wie erwartet oben angezeigt.

View v; 
for(int i = 0;i<_lvList.getChildCount();i++) { 
    v = this._lvList.getChildAt(i); 
    if(v!=clickedView) { 
      Animation animSlideOut = AnimationUtils.loadAnimation(getActivity(), i%2==0?R.anim.slide_out_left:R.anim.slide_out_right); 
      animSlideOut.setStartOffset(i*50); 

      // some more stuff 

    } 
    v.startAnimation(animSlideOut); 
} 

Dies funktioniert auch, aber jetzt ist das Problem, wenn ich auf diesem einzelnen Listeneintrag wieder klicken, möchte ich die Liste neu zu besiedeln, die Anzeige wieder alle Einzelteile.

Ich dachte, ich könnte den Code von Anfang an verwenden (das erste Snippet), wie es beim Starten der App funktioniert, aber ... dieses Mal ... es nicht. Keine Animation passiert. Der Grund dafür ist, dass in meiner ListView keine Ansichten zu animieren sind (mit Ausnahme der aus dem vorherigen Schritt).

Statt ein neues Tableadapter zu schaffen habe ich schon versucht, es zu löschen, füllen Sie es neu, genannt notifyDataSetChanged() ... nichts, als

_lvList.getChildCount(); 

Stills gibt 1 zurück Ansicht, während der Adapter alle 18 hält Einträge. Ich versuchte auch

requestLayout(); 
forceLayout(); 
invalidate(); 
invalidateViews(); 

das Listview zu zwingen, seine untergeordneten Ansichten vor der Animation zu erzeugen, aber es funktioniert nicht. So atm erscheint das ListView sofort, irgendwann nach dem Aufruf der Layoutanimation.

Zusammenfassung: Meine ListView enthält keine Kinderansichten vor dem Start der Layoutanimation, wie kann ich es zwingen, sie zu generieren?

Thx im Voraus :)

+0

haben Sie das Problem gelöst? – dexxtr

+0

@dexxtr Sorry, das war eine lange Zeit her, aber am Ende habe ich mich mit einer anderen Animation, als der Code nicht wie erwartet funktioniert ... –

+0

Ich habe bereits behoben :) das Problem war in falschem Kontext, der Verweis auf einen anderen Bildschirm – dexxtr

Antwort

1

Hmm ... hast du das schon getan? (Unten)

in Ihrem benutzerdefinierten Adapter, überschreibt die Methode:

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    //the position of the item, the convertView is the view layout of what that row is 

} 

zu ändern, wie die Listenansicht aktualisiert wird. diese getView Methode wird von Android jeder einmal eine Weile aktualisieren Sie die Ansicht (Sie müssen nicht nennen es manuell)

auch genannt wird, ich glaube, Sie nur

listView.notifiyDataSetChanged() und listView.invalidate() zu zwingen, um das Update rufen müssen, nach Sie bevölkern die Liste

Sie mehr auf Listviews hier lesen:

http://www.vogella.com/articles/AndroidListView/article.html

http://developer.android.com/guide/topics/ui/layout/listview.html

+0

Ja, ich habe einen benutzerdefinierten Adapter und ich habe eine getView(). Alles funktioniert, wenn ich die App starte, nur nicht zum zweiten Mal. Nach notify ...() und invalidate() ist die Anzahl der Ansichten von listView immer noch 1, während der Adapter 18 Einträge enthält. –

Verwandte Themen