android - RecyclerView LayoutManager findViewByPosition 返回 null

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

但此时返回null。

最佳答案

如果您正在使用 OnGlobalLayoutListener,您应该记住 onGlobalLayout 可以被多次调用。其中一些调用甚至可能在 Layout 准备就绪 之前发生(准备就绪 我的意思是您可以获得 尺寸的那一刻通过调用 view.getHeight()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);
     }
});

除此之外,您还需要确保在 findViewByPosition(0) 调用时:

  1. 您的 RecyclerView 的 Adapter 至少有一个数据元素。
  2. View 位置 0 当前在 RecyclerView
  3. 中可见

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

关于android - RecyclerView LayoutManager findViewByPosition 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29579097/

相关文章:

java - 收到错误 "java.lang.IllegalStateException: Can print only from an activity"?

android - 三星设备自动设置共享 Intent 的默认应用程序

android: ViewPager 超过 100 个 webview

android - fragment 保存 View 状态

java - 修改自定义 RecyclerView 的项目

android - 无论我做什么,我在 fragment 中的 recyclerview 都不会更新

android - 如何在android中获取堆栈跟踪c++函数名称

java - 创建由字符串设置的 recyclerView 数量?

android - RecyclerView 滚动条滞后

android - 当 setNestedScrollingEnabled 为 false 时,Recyclerview onscrolllistener 不工作