尝试在Android 5.0上使用RecyclerView时应用崩溃


91

我试图弄乱新的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选项卡导致此错误的人,请参见此解决方案
Hassan Gilak 2015年

您解决了这个问题吗?请帮我遇到同样的问题
Sagar

记住要在onCreateView删除/销毁/取消注册中设置/创建/注册onDestroyView。一定要遵循这些生命周期!
Sakiboy '17

Answers:


211

当没有LayoutManager提供时,通常会发生此问题RecyclerView。您可以这样做:

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

14
我认为这不必是最终的,所以我不认为这是问题所在。在我的情况下,我使用recyclerView实现了一个片段,并且我试图仅保留onCreateView上的对该片段的引用,并在稍后加载数据时设置layoutManager。我遇到了这个问题,当我在游戏中的onCreateView方法中设置了layoutManager时,它就消失了。
Nemanja Kovacevic

3
@NemanjaKovačević好吧,我想每个以后都不需要更改的变量都必须声明为final,这就是我在final这里声明它的原因。
aga 2015年

2
由于默认情况下LinearLayoutManager是垂直的,因此您可以使用:recyclerView.setLayoutManager(new LinearLayoutManager(context));
2015年

1
感谢上帝,我们可以将与Google完全相同的错误消息发送给Google,使它们变得有意义。
jhegedus '16

1
@wesleyfranks很难不说一下为什么获得空对象引用。1.设置RecyclerView的代码和2.崩溃后得到的stacktrace。:)
aga

26

就我而言,它与“最终”无关,但与@NemanjaKovačević中提到的问题有关,对@aga答案发表评论。我在数据加载时设置了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);

1
再过一次:我没有说这个问题与变量不是最终变量有关。问题是LayoutManager 没有提供,仅此而已。您可以使变量指向LayoutManagerfinal,也可以不指向final- 它不会改变任何内容。
aga 2015年

@Yurik我正在Activity中使用recyclerview而不是片段。对我来说是什么情况?
尤里

我认为@Youri应该将layoutManager设置放入活动的onCreate中。
YuriK

10

对我来说,我遇到了同样的问题,问题是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 ^^
Bhupinder

1
在浪费了一天之后,我尝试了您的解决方案,并且它起作用了:D [:(我的时间被浪费了]
mfaisalhyder

8

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

2
尽管如此,我的问题仍未得到解决://我尝试了几乎所有解决方案,并且在片段中使用RecyclerView时仍会得到相同的错误,该片段将显示在PagerView中:(
mfaisalhyder 2016年

太棒了!将RecyclerView初始化代码移入onViewCreated(...) 工作区
Marcelo Gracietti

我做了这个解决方案,但对我来说仍然没有用。仍在尝试找出哪里。
韦斯利

5

您需要setLayoutManagerRecyclerView#onCreate()方法中使用。在添加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));

}

3

由于RecyclerViewID 错误引用,导致出现此问题。

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

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

2
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

与您一起查看回收者视图ID,指向实际的回收者视图解决了我的问题


1

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

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


1

使用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);

1

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

活动中,我们这样使用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);

如果您想使用GridLayoutManager,请RecyclerView使用如下所示的use:

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

1

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

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

ButterKnife.bind(this);

我的带有依赖注入的RecyclerView声明:

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

1

对于正在使用的用户:实现'androidx.recyclerview:recyclerview:1.1.0-beta05'

确保您在xml布局中使用它

在API 27 以下运行我的应用程序时,我也遇到了崩溃。这是消息的链接

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

内部style.xml

并在我的主题中添加了

themes.xml

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

我尝试了在堆栈溢出中找到的所有可能的解决方案,并几乎放弃了这一点,幸运的是,出于我的好奇心,我想为什么不删除样式,否则可能导致崩溃,然后崩溃消失了。


1
请直接提供代码示例,而不要链接到图像。看一下“帮助他人重现问题”部分:stackoverflow.com/help/how-to-ask
Chris B

1
我真的很喜欢这个@ChrisB。这是我第一次在这里发表评论,因为您的声誉太低了。我今天遇到了崩溃,我当时想在这里发布信息,因为也许有人也在面对这个问题,尤其是他们使用的是“ androidx.recyclerview:recyclerview:1.1.0-beta05”。
珍妮·维

0

由于默认情况下LinearLayoutManager是垂直的,因此更简单的方法是:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

如果要更改方向,可以使用以下构造函数:

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

现在有一个奇怪的issulinearlayout经理。我实例化它,但仍然在这个错误。天啊。
filthy_wizard

0

我认为是您的问题所在Adapter。请确保你已返回ViewHolderonCreateViewHolder()。如下所示:

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

0

对我来说,问题出在我的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"
    />

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


0

在我的情况下,我仅添加了黄油刀库,却忘记添加注解处理器。通过将以下行添加到build.gradle(App模块),解决了我的问题。

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



0

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

通过在某些网站上搜索,我得到了一些感觉,就像在这里分享

  1. 将ID添加到Activity_main.xml中的Include标签

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

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

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

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


-1

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


-1

使用片段

在onCreateView()中编写代码

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

使用活动

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.