2013-03-24 19 views
22

Ho un listView e voglio aggiungere nuovi elementi nella parte superiore della visualizzazione elenco ma non desidero la visualizzazione elenco per scorrere il suo contenuto. Voglio che l'utente guardi lo stesso oggetto che stava cercando prima che fossero aggiunti nuovi elementi.ListView Android aggiungere elementi in cima senza visualizzazione elenco scorrere

Questo è come mi aggiungere nuovi elementi alla ListView:

this.commentsListViewAdapter.addRangeToTop(comments); 
this.commentsListViewAdapter.notifyDataSetChanged(); 

e questo è addRangeToTop metodo:

public void addRangeToTop(ArrayList<Comment> comments) 
{ 
    for (Comment comment : comments) 
    { 
     this.insert(comment, 0);   
    } 
} 

questo è il mio listView:

<ListView 
    android:id="@+id/CommentsListView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_above="@+id/AddCommentLayout" 
    android:stackFromBottom="true" >   
</ListView> 

Quello che voglio fare è caricare vecchi commenti quando l'utente scorre verso l'alto.

Grazie per il vostro aiuto.

risposta

30

ho trovato la soluzione qui Retaining position in ListView after calling notifyDataSetChanged

dispiace per la domanda duplicato. Il codice finale è questo:

int index = this.commentsListView.getFirstVisiblePosition() + comments.size(); 
    View v = this.commentsListView.getChildAt(commentsListView.getHeaderViewsCount()); 
    int top = (v == null) ? 0 : v.getTop();   

    this.commentsListViewAdapter.AddRangeToTop(comments); 
    this.commentsListViewAdapter.notifyDataSetChanged();  

    this.commentsListView.setSelectionFromTop(index, top); 
+0

grazie per questo! – sirvon

+1

Buona soluzione, grazie! –

2

Dai anche un'occhiata al metodo di ListView public void setSelection (int position). Dopo aver aggiunto nuovi commenti e notificato l'adattatore, è possibile utilizzarlo per mantenere selezionato l'elemento corrente.

// Get the current selected index 
int previousSelectedIndex = yourListView.getSelectedItemPosition(); 

// Change your adapter 
this.commentsListViewAdapter.AddRangeToTop(comments); 
this.commentsListViewAdapter.notifyDataSetChanged(); 


// Determine how many elements you just inserted 
int numberOfInsertedItems = comments.size(); 

// Update the selected position 
yourListView.setSelection(previousSelectedIndex + numberOfInsertedItems); 

NOTA: il codice non è stato verificato. Buona fortuna

+0

grazie, questo funziona in qualche modo, ma non molto bene. Scorre fino a due elementi. Penso che sia perché la visualizzazione elenco non scorre per elementi ma per pixel e setSelection scorre esattamente sull'elemento. – Harlsten

9

Può essere questo è quello che stai cercando:

android:transcriptMode="normal" 

"Questo rende lista scorrere automaticamente verso il basso quando un cambiamento di notifica insieme di dati viene ricevuto e solo se l'ultimo oggetto è già visibile sullo schermo. " - come citato here

+1

questa risposta dovrebbe essere contrassegnata corretta. –

Problemi correlati