2012-11-13 24 views
7

Ho un ListView con un adattatore personalizzato, visualizzando le informazioni da un database. Quando avvio l'applicazione, i dati vengono letti dal database, assegnato all'adattatore, che viene quindi collegato a ListView. A LayoutAnimationController viene eseguito su ListView, visualizzando i contenuti senza problemi.Visualizzazione elenco Android non aggiornata

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(); 

Nessun problema.

Ora quando faccio clic su qualsiasi voce di ListView, le voci che non sono state selezionate scompaiono, la voce selezionata diventa la sola e unica voce nell'elenco e viene visualizzata nella parte superiore, come previsto.

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); 
} 

questo funziona così, ma ora il problema, se clicco di nuovo su quella singola voce della lista, voglio la lista a ripopolare, mostrando ancora una volta tutti gli elementi.

Ho pensato di poter utilizzare il codice dall'inizio (il primo frammento di codice), poiché funziona correttamente all'avvio dell'app, ma ... questa volta ... non è così. Nessuna animazione in corso. Il motivo è che non ci sono viste da animare nel mio ListView (eccetto quello del passaggio precedente).

Invece di creare una nuova TableAdapter Ho già provato a cancellarlo, riempirlo di nuovo, chiamato notifyDataSetChanged() ... inutile, come

_lvList.getChildCount(); 

alambicchi restituisce 1 vista, mentre l'adattatore contiene tutti 18 inserimenti. Ho pure provato

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

per forzare il ListView per generare i suoi panorami bambino prima l'animazione, ma non sta funzionando. Quindi il ListView appare all'istante, subito dopo la mia chiamata all'animazione del layout.

Riepilogo: my ListView non contiene visualizzazioni figlio prima dell'inizio dell'animazione del layout, come posso forzarlo a generarle?

Thx in anticipo :)

+0

Hai risolto questo problema? – dexxtr

+0

@dexxtr mi dispiace, è stato tanto tempo fa, ma alla fine ho optato per un'animazione diversa, poiché il codice non funzionava come previsto ... –

+0

Ho già risolto :) il problema era nel contesto sbagliato, che ha riferimento a un'altra schermata – dexxtr

risposta

1

Hmm ... hai fatto questo ancora? (In basso)

nel vostro adattatore personalizzato, l'override del metodo:

@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 

} 

per cambiare il modo ListView viene aggiornato. questo metodo GetView viene chiamato da Android ogni volta un po 'per aggiornare la visualizzazione (non si chiama manualmente)

Inoltre, penso che avete solo bisogno di chiamare

listView.notifiyDataSetChanged() e listView.invalidate() per forzare l'aggiornamento, dopo si ripopolare la lista

si può leggere di più su listviews qui:

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

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

+0

Sì, ho un adattatore personalizzato e ho un getView(). Funziona tutto quando avvio l'app, ma non la seconda volta. Dopo la notifica ...() e invalidate() il conteggio delle visualizzazioni di listView è ancora 1, mentre l'adattatore contiene 18 voci. –

Problemi correlati