【问题标题】:App crashing when trying to use RecyclerView on android 5.0尝试在 android 5.0 上使用 RecyclerView 时应用程序崩溃
【发布时间】:2015-02-09 13:57:41
【问题描述】:

我试图弄乱新的 RecyclerView,每当我尝试运行它时,我的应用程序都会立即崩溃。它给了我 NullPointerException 尝试从android.support.v7.widget.RecyclerView 访问方法。我查看了其他帖子,发现大多数人没有compile 'com.android.support:recyclerview-v7:+',但我试过了,但根本没有帮助。目前还不确定该怎么做,任何帮助将不胜感激。这里是错误日志:(我会发布一张图片,但我还没有 10 个代表)

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764)
        at android.view.View.measure(View.java:17430)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:851)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

【问题讨论】:

  • 对于因 Viewpager 选项卡导致此错误的任何人,请参阅此solution
  • 你解决了吗?请帮助我遇到同样的问题
  • 记得在onCreateView 中设置/创建/注册您在onDestroyView 中删除/销毁/取消注册的内容...必须遵循这些生命周期!

标签: java android android-layout android-recyclerview android-5.0-lollipop


【解决方案1】:

我在使用 Butterknife 时遇到了这个问题,我使用的是 fragment

Fragment 应该是ButterKnife.bind(this,view);

活动ButterKnife.bind(this);

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,因为我将 RecyclerView 放在另一个布局中,而不是在 activity_main.xml 上。

    通过在一些网站上搜索,我得到了一些东西并想在这里分享

    1. 在 Activity_main.xml 中添加 Id 以包含标签

      <include id="includedRecyclerLayout" .... </include>

    2. 在 MainActivity.java 中按 ID 搜索视图之前调用此布局

      `ConstraintLayout includedLayout = findViewById(R.id.inckudedRecyclerLayout);

      RecyclerViewrecyclerview=includedLayout.findViewById(R.id.RECYCLER_VIEW_ID)`;

    【讨论】:

      【解决方案3】:

      我在 GenyMotion 上测试我的应用程序时遇到了类似的问题。 GenyMotion 重启设备后问题解决了

      【讨论】:

        【解决方案4】:

        对于那些正在使用的人: implementation 'androidx.recyclerview:recyclerview:1.1.0-beta05'

        确保您在 xml 布局中使用它

        在 API 27 以下运行我的应用时,我也遇到了崩溃。Here's a link to the message

        最初,我创建了一种样式来更改 recyclerview 中 textview 的字体大小,这就是我在下面创建此代码的原因:(在根据屏幕大小更改字体大小时,我可以调用 @dimen)

        Inside style.xml

        并将其添加到我的主题中

        themes.xml

        经过调查,我发现这是导致我出错的原因,删除样式后,我不再遇到崩溃。

        我尝试了在堆栈溢出中找到的所有可能的解决方案,但几乎放弃了,幸好我好奇地想为什么不删除样式可能会导致崩溃,然后崩溃消失了。

        【讨论】:

        • 请直接包含代码示例,而不是链接到图像。看看“帮助他人重现问题”部分:stackoverflow.com/help/how-to-ask
        • 我真的很喜欢这个@ChrisB。这是我第一次在这里发表评论,因为您可以看到我的声誉太低了。我今天遇到了崩溃,我想在这里发帖,因为也许有些人也面临这个问题,特别是他们正在使用'androidx.recyclerview:recyclerview:1.1.0-beta05'。
        【解决方案5】:

        Recyclerview recylerview = findbyid(R.id.recyclerview) 可能你错过了

        【讨论】:

        • 嗨,欢迎来到 SO!请进一步解释为什么这与这个问题有关。就目前所写的内容而言,很难说出您指的是什么。
        【解决方案6】:

        在我的例子中,我只添加了黄油刀库而忘记添加 annotationProcessor。通过将以下行添加到 build.gradle(App 模块),解决了我的问题。

            annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
        

        【讨论】:

          【解决方案7】:

          使用片段

          在 onCreateView() 中编写代码

          RecyclerView recyVideo = view.findViewById(R.id.recyVideoFag);

          使用活动

          在 onCreate() 中编写代码 RecyclerView recyVideo = findViewById(R.id.recyVideoFag);

          【讨论】:

            【解决方案8】:

            我使用的是依赖注入 - ButterKnife,出现这个问题是因为我没有绑定视图。

            所以在 onCreate() 里面我只是插入了这一行:

            ButterKnife.bind(this);
            

            我使用依赖注入的 RecyclerView 声明:

            @BindView(R.id.recyclerview)
            RecyclerView recyclerView;
            

            【讨论】:

              【解决方案9】:

              Gradle 中实现这个库:

              implementation 'com.android.support:appcompat-v7:SDK_VER'
              implementation 'com.android.support:design:SDK_VER'
              implementation 'com.android.support:support-v4:SDK_VER'
              implementation 'com.android.support:support-v13:SDK_VER'
              implementation 'com.android.support:recyclerview-v7:SDK_VER'
              

              XML 中这样提及:

              <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/recyclerView"/>
              

              Fragment中,我们像这样使用recyclerView

              @Override
                  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                           Bundle savedInstanceState) {
                      // Inflate the layout for this fragment
                     View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);
              
                     RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
                      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
                      recyclerView.setLayoutManager(layoutManager);
                      APICallMethod();
                      YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
                      recyclerView.setAdapter(YOURADAPTER);
                      return rootView;
                  }
              

              Activity中,我们像这样使用RecyclerView

              @Override
                  protected void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.YOUR_LAYOUT_NAME);
              
                      RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
                      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
                      recyclerView.setLayoutManager(layoutManager);
                      APICallMethod();
                      YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
                      recyclerView.setAdapter(YOURADAPTER);
                 }
              

              如果您需要水平 RecyclerView 这样做:

              RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
                      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
                      recyclerView.setLayoutManager(layoutManager);
                      APICallMethod();
                      YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
                      recyclerView.setAdapter(YOURADAPTER);
              

              如果你想通过RecyclerView 使用 GridLayoutManager,请像这样使用:

                      RecyclerView recyclerView = findViewById(R.id.rvNumbers);
                      recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
                      adapter = new MyRecyclerViewAdapter(this, data);
                      recyclerView.setAdapter(adapter);
              

              【讨论】:

                【解决方案10】:

                对我来说,问题出在我的 activity_main.xml(21) 中,recycleView 没有 id。

                activity_main.xml(21)

                 <android.support.v7.widget.RecyclerView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:layout_marginLeft="8dp"
                    android:layout_marginTop="8dp"
                    android:layout_marginEnd="8dp"
                    android:layout_marginRight="8dp"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/button3"
                    tools:listitem="@layout/transaction_list_row" />
                

                activity_main.xml

                <android.support.v7.widget.RecyclerView
                
                    android:id="@+id/transac_recycler_view"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:layout_marginLeft="8dp"
                    android:layout_marginTop="8dp"
                    android:layout_marginEnd="8dp"
                    android:layout_marginRight="8dp"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/button3"
                    />
                

                当我将 android:id="@+id/transac_recycler_view" 添加到 activity_main.xml(21) recycleView 时,它起作用了

                【讨论】:

                  【解决方案11】:

                  如果我在你身边,我会这样做。 onView(withId(android.R.id.list)).perform(RecyclerViewActions.scrollToPosition(3)); android.R.id.list 将其更改为您的列表 ID,位置将是您在数组中的位置。

                  【讨论】:

                    【解决方案12】:

                    我在使用 Butterknife 库时遇到了这个问题。 我有:

                    View rootView = inflater.inflate
                                    (R.layout.fragment_recipe_detail_view, container, false);
                    ButterKnife.bind(rootView);
                    

                    但正确的版本是:

                    View rootView = inflater.inflate
                                    (R.layout.fragment_recipe_detail_view, container, false);
                    ButterKnife.bind(this, rootView);
                    

                    【讨论】:

                      【解决方案13】:

                      我的问题出在我的 XML 布局中,我将 android:animateLayoutChanges 设置为 true,并且在 Java 代码中的 RecyclerView 的适配器上调用了 notifyDataSetChanged()。

                      所以,我刚刚从我的布局中删除了 android:animateLayoutChanges,这解决了我的问题。

                      【讨论】:

                        【解决方案14】:

                        由于RecyclerView id 的引用错误,我遇到了这个问题。

                        recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);
                        

                        recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
                        

                        【讨论】:

                          【解决方案15】:

                          我认为问题出在您的Adapter。 确保您在onCreateViewHolder() 中返回了ViewHolder。 如下:

                          @Override
                          public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                              View v;
                              v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
                              ViewHolder view_holder = new ViewHolder(v);
                              return view_holder;
                          }
                          

                          【讨论】:

                            【解决方案16】:
                            recyclerView =
                                        (RecyclerView) findViewById(R.id.recycler_view2);
                            

                            检查您的回收站视图 ID,指向实际的回收站视图解决了我的问题

                            【讨论】:

                              【解决方案17】:

                              您需要在RecyclerView#onCreate() 方法中使用setLayoutManager。在将recyclerView 添加到视图之前,它必须设置LayoutManager

                               private RecyclerView menuAsList;
                              
                              @Override
                              protected void onCreate(Bundle savedInstanceState) {
                                  super.onCreate(savedInstanceState);
                                  setContentView(R.layout.activity_home);
                              
                                  menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
                                  menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));
                              
                              }
                              

                              【讨论】:

                                【解决方案18】:

                                对我来说,我遇到了同样的问题,问题是 xml 中有一个未使用的 RecyclerView 视图消失了,但我没有将它绑定到 Activity 中的任何适配器,因此出现了问题。一旦我在 xml 中删除了这些未使用的回收器视图,它就解决了

                                即 - 我删除了这个视图,因为它没有在代码中调用或任何适配器已设置

                                <android.support.v7.widget.RecyclerView
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent"
                                        android:id="@+id/rv_profileview_allactivities"
                                        android:visibility="gone" />
                                

                                【讨论】:

                                • 同样在这里一切都很完美,但它不起作用。所以我删除了未使用的recyclerviews,它没有任何问题。谢谢@Maurice ^^
                                • 在浪费了一天之后,我尝试了您的解决方案,它奏效了 :D [ :( 我的时间被浪费了]
                                【解决方案19】:

                                当没有为RecyclerView 提供LayoutManager 时,通常会出现此问题。你可以这样做:

                                final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
                                layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                                recyclerView.setLayoutManager(layoutManager);
                                

                                【讨论】:

                                • 我认为它不需要是最终的,所以我认为这不是问题所在。在我的例子中,我正在使用 recyclerView 实现一个片段,我试图只保留 onCreateView 对它的引用,并在稍后加载数据时设置一个 layoutManager。我遇到了这个问题,当我早些时候在 gamein onCreateView 方法中设置 layoutManager 时,它就消失了。
                                • @NemanjaKovačević 好吧,我想以后不需要更改的每个变量都必须声明为final,这就是为什么我在这里声明为final
                                • 由于LinearLayoutManager默认是垂直的,你可以使用:recyclerView.setLayoutManager(new LinearLayoutManager(context));
                                • 感谢上帝,我们可以通过 Google 搜索出与 Google 相同的错误消息,以便从中理解。
                                • @wesleyfranks 如果不查看 1. 设置 RecyclerView 的代码和 2. 崩溃后得到的堆栈跟踪,很难说出为什么会得到空对象引用。 :)
                                【解决方案20】:

                                由于 LinearLayoutManager 默认是垂直的,一个更简单的方法是:

                                recyclerView.setLayoutManager(new LinearLayoutManager(context));

                                如果你想改变方向,你可以使用这个构造函数:

                                public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
                                

                                【讨论】:

                                • 现在有一个奇怪的问题线性布局管理器。我正在实例化它,但仍然出现这个错误。圣牛。
                                【解决方案21】:

                                即使我正确设置了RecyclerView.LayoutManager,我也经历了这次崩溃。我不得不将 RecyclerView 初始化代码移动到 onViewCreated(...) 回调中来解决这个问题。

                                @Override
                                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                                         Bundle savedInstanceState) {
                                    View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
                                    rootView.setTag(TAG);
                                    return inflater.inflate(R.layout.fragment_listing, container, false);
                                }
                                
                                @Override
                                public void onViewCreated(View view, Bundle savedInstanceState) {
                                    super.onViewCreated(view, savedInstanceState);
                                
                                    mLayoutManager = new LinearLayoutManager(getActivity());
                                    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                                
                                    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
                                    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
                                    mRecyclerView.setLayoutManager(mLayoutManager);
                                
                                    mAdapter = new ListingAdapter(mListing);
                                    mRecyclerView.setAdapter(mAdapter);
                                }
                                

                                【讨论】:

                                • 不过,我的问题仍未解决:/ 我尝试了几乎所有解决方案,但在 PagerView 中显示的片段中使用 RecyclerView 时仍然遇到相同的错误:(
                                • 太棒了!将 RecyclerView 初始化代码移动到 onViewCreated(...) 中工作
                                • 我做了这个解决方案,但对我来说仍然是空的。仍在试图弄清楚在哪里。
                                【解决方案22】:

                                在我的情况下,它与“最终”无关,而是与@aga 回答的@NemanjaKovačević 评论中提到的问题有关。 我在数据加载时设置了一个 layoutManager,这就是同样崩溃的原因。 将 layoutManager 设置移动到我的片段的 onCreateView 后,问题得到修复。

                                类似这样的:

                                @Override
                                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                                             Bundle savedInstanceState)
                                {
                                ...
                                mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);
                                
                                mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
                                mRecyclerView.setLayoutManager(mLayoutManager);
                                

                                【讨论】:

                                • 再来一次:我不认为这个问题与变量不是最终的有关。问题是LayoutManager 没有提供,就是这样。您可以使变量指向 LayoutManager 最终或非最终的 - 它不会改变任何东西。
                                • @Yurik 我在 Activity 中使用 recyclerview 而不是在片段上。我怎么了?
                                • @Youri 你应该把 layoutManager 设置到你的活动的 onCreate 中,我认为。
                                猜你喜欢
                                • 1970-01-01
                                • 2018-06-27
                                • 2018-07-30
                                • 2015-04-24
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多