2016-01-11 34 views
5

Mam widok RecyclerView z podglądem wideo w nim. Gdy użytkownik przewija, filmy powinny być automatycznie odtwarzane na elementach recyclerView, które są widoczne dla użytkownika (gdy stan przewijania jest IDLE).Wyświetl widok z RecyclerView by AdapterPosition

Więc napisałem niestandardowy onScrollListener, który przekazuje pozycje, które są widoczne dla użytkownika jako tablica do metody startVideosOn(int[] positions).

Ale problem polega na tym, że chcę uzyskać widok według pozycji (pozycja jest równa pozycji adaptera). Kiedy próbuję linearLayoutManager.getChildAt(index) otrzymuję null, gdy wyświetlany jest trzeci element, ponieważ widok RecyclerView ma tylko 2 childs, które zostaną poddane recyklingowi.

Jak mogę uzyskać View z RecyclerView według pozycji adaptera?

Edycja ta jest 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

po przewinąć kod słuchacza – pskink

+1

Próbowałem 'RecyclerView # findViewHolderForAdapterPosition (pozycja int)' lub 'RecyclerView # findViewHolderForLayoutPosition (pozycja int)'? – pskink

+0

@pskink Czy możesz to opublikować jako odpowiedź, więc mogę ją zaakceptować? – PatrickMA

Odpowiedz

11

jeśli trzeba uzyskać wszelkie View dla "pozycji" widocznym albo zastosowanie:

RecyclerView#findViewHolderForAdapterPosition(int position) 

lub

RecyclerView#findViewHolderForLayoutPosition(int position) 

się wrócił ViewHolder odbędzie się View, którego chcesz

+1

Dziękuję bardzo. Nie wiem, dlaczego tego nie znalazłem. – PatrickMA

+0

serdecznie zapraszamy ... szczęśliwe kodowanie;) – pskink

+0

Prawdopodobnie dlatego, że jest w klasie 'RecyclerView', a nie w' RecyclerView # Adapter', z którym najczęściej pracujemy ... –