2016-01-11 7 views
5

Ich habe eine RecyclerView mit Video-Vorschau in es. Wenn der Benutzer scrollt, sollten die Videos automatisch auf den RecyclerView-Elementen abgespielt werden, die für den Benutzer sichtbar sind (wenn scroll-state IDLE ist).Get View von RecyclerView von AdapterPosition

Also habe ich einen benutzerdefinierten onScrollListener geschrieben, der die Positionen, die für den Benutzer als ein Array angezeigt werden, an die Methode startVideosOn(int[] positions) übergibt.

Aber das Problem ist, wenn ich die Ansicht durch die Position bekommen möchte (die Position ist gleich der Adapterposition). Wenn ich linearLayoutManager.getChildAt(index) versuche, erhalte ich null, wenn der 3. Gegenstand angezeigt wird, weil der RecyclerView nur 2 Kinder hat, die recycelt werden.

Wie also schaffe ich es, die View des RecyclerView durch Adapterposition zu bekommen?

bearbeiten, ist dies die 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 Sie scrollen Listener-Code – pskink

+1

probiert 'RecyclerView # findViewHolderForAdapterPosition (int Position)' oder 'RecyclerView # findViewHolderForLayoutPosition (int Position)'? – pskink

+0

@pskink Können Sie dies als Antwort posten, damit ich es akzeptieren kann? – PatrickMA

Antwort

11

, wenn Sie irgendeine View für eine sichtbare "Position" entweder Gebrauch erhalten müssen:

RecyclerView#findViewHolderForAdapterPosition(int position) 

oder

RecyclerView#findViewHolderForLayoutPosition(int position) 

die zurückgegeben ViewHolder wird die View halten Sie wollen

+1

Vielen Dank. Ich weiß nicht, warum ich das nicht gefunden habe. – PatrickMA

+0

Sie sind herzlich willkommen ... Happy Coding;) – pskink

+0

Wahrscheinlich, weil es in 'RecyclerView' Klasse und nicht in' RecyclerView # Adapter' ist das ist die eine, die wir meist arbeiten mit ... –