RecyclerView LayoutManager findViewByPosition返回null

Ale*_*sky 8 android android-recyclerview

我对获得RecyclerView第一项物品大小的正确和第一时间感兴趣?

我试过用:

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
     }
});
Run Code Online (Sandbox Code Playgroud)

但此时它返回null.

Bar*_*ski 3

如果你正在使用OnGlobalLayoutListener你应该记住onGlobalLayout可以被多次调用。其中一些调用甚至可以在Layout 准备好之前发生(我所说的准备好View是指您可以通过调用view.getHeight()或来获取 a 的尺寸的那一刻view.getWidth())。因此,实施您的方法的正确方法是:

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);
     }
});
Run Code Online (Sandbox Code Playgroud)

除此之外,您还需要在致电时确保findViewByPosition(0)

  1. RecyclerView's Adapter至少有一个数据元素。
  2. Viewat 位置0当前可见RecyclerView

告诉我这是否可以解决您的问题,如果没有,还有另一种方法可以满足您的需求。