2015-12-01 1 views
7

Possiedo un RecyclerView + LinearLayoutManger che utilizza un adattatore che contiene i messaggi di chat. Limito il numero di messaggi di chat al massimo 100 recenti. Questo problema è che quando rimuovo le chat più vecchie, la posizione di scorrimento delle chat nel recyclerview cambia perché l'indice 0 è stato rimosso. Ho iniziato a scrivere il codice seguente:Ricerca dell'offset superiore del primo oggetto visibile in un RecyclerView

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(firstVisiblePosition); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = //need to get the view offset here; 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 

Ho pensato che sarebbe stato facile ottenere l'offset visibile della prima posizione dell'oggetto visibile. Ex. se la prima vista visibile è 300 dpi ma è visibile solo l'ultima 200 dpi, vorrei ottenere il 100 offset.

In questo modo è possibile utilizzare scrollToPositionWithOffset (firstVisiblePosition - 1, offsetTop).

Mi manca qualcosa qui? Sembra che sarebbe un problema facile da capire, ma non ho visto nessun metodo per supportarlo.

+1

hai provato con 'v.getHeight() - v.getTop()' – Blackbelt

+0

Lo esaminerò ulteriormente. Penso che v.getTop() ottenga la coordinata y dell'altezza di scroll totale, non relativa alla posizione del top del recyclerview stesso. – tylerjroach

risposta

8

@Blackbelt. Grazie per avermi fatto sulla buona strada.

L'offset di cui avevo bisogno era in realtà solo v.getTop();

Il mio vero problema era in getChildAt(). Apparentemente getChildAt inizia dalla prima posizione visibile, non dalla posizione dell'adattatore. La documentazione è scritta male in questo caso.

Ecco il codice risultante.

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(0); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = v.getTop(); 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 
+0

Puoi usare 'Visualizza v = layoutManager.findViewByPosition (posizione)' –

Problemi correlati