2013-04-18 8 views
9

Ho impostato un timer nella mia app, sono riuscito a ottenere alcune informazioni da un servizio Web e ho generato una visualizzazione elenco da visualizzare. Ora il mio problema è che ogni volta che il timer è in esecuzione, scorrere fino all'inizio ...mantiene la posizione di scorrimento ad ogni aggiornamento nella visualizzazione elenco

come posso mantenere la posizione di scorrimento ad ogni aggiornamento nella visualizzazione elenco?

parte del mio codice:

runOnUiThread(new Runnable() { 
    public void run() { 
     /** 
     * Updating parsed JSON data into ListView 
     * */ 
     ListAdapter adapter = new SimpleAdapter(DashboardActivity.this, 
               all_chat, 
               R.layout.list_item, 
               new String[] { TAG_FULLNAME, 
                   TAG_DATE, 
                   TAG_MESSAGE }, 
               new int[] { R.id.fullname, 
                  R.id.date, 
                  R.id.message } 
               ); 
     // updating listview 
     setListAdapter(adapter); 
    } 
}); 

TNx.

+0

http://stackoverflow.com/a/3035521/931982 – stinepike

+0

possibile duplicato di [Mantieni/Salva/Ripristina posizione di scorrimento quando si torna a un ListView] (http://stackoverflow.com/questions/3014089/maintain-save -restore-scroll-position-when-return-to-a-listview) – stinepike

+0

Questi collegamenti non risolvono il mio problema, perché il mio problema è un'altra cosa. il mio listview riceve automaticamente un dato dal servizio Web e quindi sposta la posizione indietro fino all'inizio (posizione in alto) ...., spero che tu mi possa undrestan ... tnx. –

risposta

6

È possibile aggiungere il seguente attributo al numero ListView in xml.

android:stackFromBottom="true" 
android:transcriptMode="alwaysScroll" 

aggiungere questi attributi e la tua ListView sarà sempre trarre in basso come si vuole che sia in una chat.

o se si desidera mantenere nello stesso posto che era prima, sostituire alwaysScroll-normal

in the android:transcriptMode attribute. 

Evviva !!!

1

C'è uno good article by Chris Banes. Per la prima parte, basta usare ListView#setSelectionFromTop(int) per mantenere ListView nella stessa posizione visibile. Per evitare lo sfarfallio dello ListView, la soluzione consiste semplicemente nel bloccare ListView dalla configurazione dei suoi figli.

+1

blocco da cosa? – mixel

+0

whoops, aggiornato – f2prateek

14

Non chiamare setAdapter(). Fare qualcosa di simile:

ListAdapter adapter; // declare as class level variable 

runOnUiThread(new Runnable() { 
    public void run() { 
     /** 
     * Updating parsed JSON data into ListView 
     */ 
     if (adapter == null) { 
      adapter = new SimpleAdapter(
        DashboardActivity.this, all_chat, R.layout.list_item, new String[]{TAG_FULLNAME, TAG_DATE, TAG_MESSAGE}, 
        new int[]{R.id.fullname, R.id.date, R.id.message}); 
      setListAdapter(adapter); 
     } else { 
      //update only dataset 
      allChat = latestetParedJson; 
      ((SimpleAdapter) adapter).notifyDataSetChanged(); 
     } 
     // updating listview 
    } 
}); 
+3

Sono le stesse variabili 'allChat' e' all_chat'? Passare allChat al costruttore dell'adattatore e quindi modificare il riferimento allChat non significa che allChat verrà modificato nell'adattatore. – mixel

2

Ho avuto lo stesso problema, provato un sacco di cose per evitare che la lista di modificare la sua posizione di scorrimento, tra cui:

android:stackFromBottom="true" 
android:transcriptMode="alwaysScroll" 

e non chiamare listView.setAdapter(); Niente di tutto questo ha lavorato fino a quando ho trovato this answer:

che assomiglia a questo:

// save index and top position 
int index = mList.getFirstVisiblePosition(); 
View v = mList.getChildAt(0); 
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop()); 

// ... 

// restore index and position 
mList.setSelectionFromTop(index, top); 

Spiegazione:

ListView.getFirstVisiblePosition() restituisce l'elemento in cima alla lista visibile. Ma questo elemento potrebbe essere parzialmente sfogliato e, se si desidera ripristinare la posizione di scorrimento esatta dell'elenco, è necessario ottenere questo offset. Quindi ListView.getChildAt(0) restituisce View per l'elemento dell'elenco superiore, quindi View.getTop() - mList.getPaddingTop() restituisce il relativo offset dalla parte superiore dello ListView. Quindi, per ripristinare la posizione di scorrimento di ListView, chiamiamo ListView.setSelectionFromTop() con l'indice dell'articolo desiderato e un offset per posizionare il suo margine superiore dalla parte superiore dello ListView.

Problemi correlati