2016-01-11 26 views
5

Ho un RecyclerView con anteprime video al suo interno. Quando l'utente sta scorrendo, i video dovrebbero essere riprodotti automaticamente sugli elementi recyclerView che sono visibili all'utente (quando lo stato di scorrimento è IDLE).Ottieni la vista di RecyclerView per AdapterPosition

Quindi ho scritto suScrollListener personalizzato che passa le posizioni che sono visibili all'utente come una matrice al metodo startVideosOn(int[] positions).

Ma il problema è quando voglio ottenere la vista dalla posizione (la posizione è uguale alla posizione dell'adattatore). Quando provo linearLayoutManager.getChildAt(index) ottengo null quando viene visualizzato il terzo elemento, perché RecyclerView ha solo 2 childs, che verranno riciclati.

Quindi, come posso ottenere il View di RecyclerView in base alla posizione dell'adattatore?

Edit, questo è l'OnScrollListener:

public abstract class AutoPlayRecyclerOnScrollListener extends RecyclerView.OnScrollListener { 

    LinearLayoutManager linearLayoutManager; 

    public AutoPlayRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) { 
     this.linearLayoutManager = linearLayoutManager; 
    } 

    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 

     if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { 
      int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); 
      int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); 

      if (firstVisibleItemPosition != -1 && lastVisibleItemPosition != -1) { 
       playOn(firstVisibleItemPosition, lastVisibleItemPosition); 
      } 
     } 
    } 

    private void playOn(int lower, int upper) { 
     int[] completelyVisibleItems = new int[upper - lower + 1]; 

     for (int i = lower, j = 0; i <= upper; i++, j++) { 
      completelyVisibleItems[j] = i; 
     } 

     playOn(completelyVisibleItems); 
    } 

    public abstract void playOn(int[] items); 
} 
+0

post you scroll codice listener – pskink

+1

provato 'RecyclerView # findViewHolderForAdapterPosition (int position)' o 'RecyclerView # findViewHolderForLayoutPosition (int position)'? – pskink

+0

@pskink Puoi postare questo come risposta, quindi posso accettarlo? – PatrickMA

risposta

11

se avete bisogno di ottenere qualsiasi View per una "posizione" visibile sia per uso:

RecyclerView#findViewHolderForAdapterPosition(int position) 

o

RecyclerView#findViewHolderForLayoutPosition(int position) 

la restituito ViewHolder si terrà il View che si desidera

+1

Grazie mille. Non so perché non l'ho trovato. – PatrickMA

+0

sei il benvenuto ... codifica felice;) – pskink

+0

Probabilmente perché è in classe 'RecyclerView' e non in' Adattatore # RecyclerView' che è quello con cui lavoriamo principalmente ... –