2015-04-11 14 views
7

RecyclerView öğesinin ilk öğesinin boyutunu almak için doğru ve ilk olası anın ne olduğunu merak ediyorum.RecyclerView LayoutManager findViewByPosition döndürüyor null

Ben kullanmayı denedik:

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 
    } 
}); 

ama şu anda boş döner.

cevap

3

OnGlobalLayoutListener kullanıyorsanız, onGlobalLayout'un birden çok kez çağrılabileceğini unutmayın. Bu aramaların bazıları bile önce Layout hazır olabilir (ve view.getHeight() veya view.getWidth() arayarak View boyutlarını almak varken hazır tarafından anı demek). Yani bir yaklaşımın uygun yolu olacaktır:

dışında hala emin olmak gerekir bundan
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); 
    } 
}); 

o findViewByPosition(0) saat çağrısı:

  1. Sizin RecyclerView'sAdapter olan en az bir veri elemanı . pozisyon 0 de
  2. ViewRecyclerView

senin sorunun çözülüp çözülmediğini değil hala ne gerek yapmanın başka bir yolu varsa, söyle şu anda görülebilir. Benim RecyclerView genişletilmiş olarak

0

Ben bu tür bir sorunu vardı bu

@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

onWindowFocusChanged çözüldü? –

0

gibi onChildAttachedToWindow geçersiz kılar. Geri bildirim görünümünün ilk görünür konumunda varsayılan olarak tıklama yapmak istiyorum. OnResume üzerinde bunun için kod yazdım ama işe yaramadı. Ben kod yazma ile benim sorunum yöntemi ben bu kılma yöntemi yazmak zorunda yapmak

@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; 
    } 

} 
İlgili konular