2015-04-11 6 views
7

Ich interessiere mich für den richtigen und ersten möglichen Moment, um die Größe des ersten Elements von RecyclerView zu erhalten?RecyclerView LayoutManager findViewByPosition gibt null zurück

habe ich versucht, zu verwenden:

recyclerView.setLayoutManager(new GridLayoutManager(context, 2)); 
recyclerView.setAdapter(new MyDymmyGridRecyclerAdapter(context)); 
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     recyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     View firstRecyclerViewItem = recyclerView.getLayoutManager().findViewByPosition(0); 
     // firstRecyclerViewItem is null here 
    } 
}); 

aber es gibt in diesem Moment null.

Antwort

3

Wenn Sie OnGlobalLayoutListener verwenden, sollten Sie sich daran erinnern, kann mehrmals aufgerufen werden. Einige dieser Anrufe kann sogar passieren, bevor Layoutist bereit (und von bereit ich meine den Moment, wenn Sie Dimensionen eines View von view.getHeight() oder view.getWidth() Aufruf bekommen). So ist der richtige Weg, um Ihren Ansatz umzusetzen wäre:

recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int width = recyclerView.getWidth(); 
     int height = recyclerView.getHeight(); 
     if (width > 0 && height > 0) { 
      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
       recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       recyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
     } 

     View firstRecyclerViewItem = recyclerView.getLayoutManager().findViewByPosition(0); 
    } 
}); 

Abgesehen davon, dass Sie immer noch sicher sein müssen, dass zum Zeitpunkt der findViewByPosition(0) Aufruf:

  1. Ihr RecyclerView'sAdapter mindestens ein Datenelement .
  2. View an Position 0 ist derzeit sichtbar in RecyclerView

Sag mir, wenn das Ihr Problem behebt, wenn nicht noch eine andere Art und Weise zu tun, was, die Sie benötigen.

0

In meinem erweiterten RecyclerView ich onChildAttachedToWindow wie diese außer Kraft setzen

@Override 
public void onChildAttachedToWindow(View child) { 
    super.onChildAttachedToWindow(child); 

    if (!mIsChildHeightSet) { 
     // only need height of one child as they are all the same height 
     child.measure(0, 0); 
     // do stuff with child.getMeasuredHeight() 
     mIsChildHeightSet = true; 
    } 
} 
+0

wo ich diese Überschreibung Methode schreiben tun? –

0

ich diese Art von Problem hatte. Ich möchte standardmäßig auf die erste sichtbare Position der Recylerview klicken. Ich habe den Code dafür auf onResume geschrieben, aber es hat nicht funktioniert. Ich mein Problem gelöst, indem Sie den Code in writting onWindowFocusChanged Methode

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    if(isCalledForTheFirstTime) 
    { 
     LinearLayoutManager manager= (LinearLayoutManager) rcViewHeader.getLayoutManager(); 
     int pos= manager.findFirstCompletelyVisibleItemPosition(); 


     View view=manager.findViewByPosition(pos); 
     if(view!=null) 
     { 
      view.performClick(); 
     } 

     // change the vaule so that it would not be call in case a pop up appear or disappear 
     isCalledForTheFirstTime=false; 
    } 

}