Сбой приложения при попытке использовать RecyclerView на Android 5.0

Я пытаюсь возиться с новым 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)

person Joe    schedule 11.12.2014    source источник
comment
для всех, у кого есть эта ошибка, вызванная вкладками Viewpager, см. это решение   -  person Hassan Gilak    schedule 28.12.2015
comment
Вы решили эту проблему? Пожалуйста, помогите, у меня такая же проблема   -  person Sagar    schedule 28.11.2017
comment
Не забудьте установить / создать / зарегистрировать в onCreateView то, что вы удаляете / уничтожаете / отменяете регистрацию в _2 _... Надо следовать этим жизненным циклам!   -  person Sakiboy    schedule 04.12.2017


Ответы (22)


Эта проблема обычно возникает, когда не было предоставлено LayoutManager для RecyclerView. Сделать это можно так:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
person aga    schedule 11.12.2014
comment
Спасибо, что исправили. Я не устанавливал layoutManager как final. - person Joe; 11.12.2014
comment
Я не думаю, что он должен быть окончательным, поэтому не думаю, что это была проблема. В моем случае я реализовал фрагмент с помощью recyclerView, и я попытался просто сохранить ссылку на него из onCreateView и установить layoutManager позже, когда данные будут загружены. У меня была эта проблема, и она исчезла, когда я ранее в игре установил layoutManager в методе onCreateView. - person Nemanja Kovacevic; 01.01.2015
comment
@ NemanjaKovačević Ну, я полагаю, что каждая переменная, которую не нужно менять позже, должна быть объявлена ​​как final, поэтому я объявил ее здесь final. - person aga; 01.01.2015
comment
Поскольку LinearLayoutManager по умолчанию вертикальный, вы можете использовать: recyclerView.setLayoutManager (new LinearLayoutManager (context)); - person l-l; 25.02.2015
comment
Слава Богу, что мы можем использовать Google те же самые сообщения об ошибках, которые делает Google, чтобы разобраться в них. - person jhegedus; 25.08.2016
comment
Моя проблема все еще существует. Я получаю ссылку на нулевой объект даже с этим решением. - person wesley franks; 20.06.2019
comment
@wesleyfranks трудно сказать, почему вы получаете ссылку на нулевой объект, не глядя: 1. на код, который устанавливает RecyclerView, и 2. на трассировку стека, которую вы получаете после сбоя. :) - person aga; 20.06.2019
comment
Спасибо, не знаю ни о ком еще, но я обнаружил, что беру то, что пытаюсь сделать. Поместите его в собственное приложение, чтобы сосредоточиться на этой функции / функции / и т. Д. помогает мне разобраться в проблеме. Честно говоря, я до сих пор не понимаю, что произошло, но я смог завершить то, что пытаюсь сделать. Спасибо за ваш ответ и готовность помочь. - person wesley franks; 22.06.2019

В моем случае это было связано не с «финалом», а с проблемой, упомянутой в комментарии @ 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);
person YuriK    schedule 02.01.2015
comment
Еще раз: я не говорю, что эта проблема как-то связана с тем, что переменная не является окончательной. Проблема в том, что LayoutManager не был предоставлен, вот и все. Вы можете сделать переменную, указывающую на LayoutManager, окончательной или не окончательной - это ничего не меняет. - person aga; 13.01.2015
comment
@Yurik, я использую recyclerview в Activity, а не на фрагменте. какой случай для меня? - person Youri; 18.08.2016
comment
@Youri, я думаю, вам следует просто поместить настройку layoutManager в onCreate вашей активности. - person YuriK; 19.08.2016

Для меня у меня была та же проблема, проблема заключалась в том, что в 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" />
person Maurice    schedule 10.06.2015
comment
Здесь же все было идеально, но не работало. Поэтому я удалил неиспользуемые recyclerviews, и все заработало без каких-либо проблем. Спасибо, чувак @Maurice ^^ - person Bhupinder; 15.07.2015
comment
потратив день, я попробовал ваше решение, и оно сработало: D [:( мое время было потрачено зря] - person mfaisalhyder; 27.01.2016

Я испытал этот сбой, хотя у меня был правильно установлен 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);
}
person Shirish Kamath    schedule 28.01.2015
comment
Тем не менее, моя проблема не решена: / я пробовал почти все решения и все еще получаю ту же ошибку при использовании RecyclerView внутри фрагмента, который будет отображаться в PagerView :( - person mfaisalhyder; 27.01.2016
comment
Потрясающий! Перемещение кода инициализации RecyclerView в onViewCreated(...) сработало - person Marcelo Gracietti; 31.05.2017
comment
Я сделал это решение, и оно все еще было для меня нулевым. Но все еще пытаюсь понять, где именно. - person wesley franks; 20.06.2019

Вам нужно использовать setLayoutManager в методе RecyclerView#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));

}
person katwal-Dipak    schedule 05.08.2015

У меня возникла эта проблема из-за неправильной ссылки на RecyclerView id.

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

to

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
person Steve    schedule 26.09.2016

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

Свяжитесь с вашим идентификатором представления ресайклера, указав, что фактическое представление ресайклера решило мою проблему

person iam_muqshid    schedule 04.10.2016

Моя проблема заключалась в моем XML-файле, у меня для android: animateLayoutChanges установлено значение true, и я вызвал notifyDataSetChanged () в адаптере RecyclerView в коде Java.

Итак, я только что удалил android: animateLayoutChanges из своего макета, и это решило мою проблему.

person Ahlem Jarrar    schedule 14.12.2017

У меня возникла эта проблема при использовании библиотеки 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);
person Ivars Briedis    schedule 13.03.2018

В 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"/>

В Фрагменте мы используем 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);

если вы хотите использовать GridLayoutManager с RecyclerView, используйте следующее:

        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);
person Abhinav Gupta    schedule 26.10.2018

Я использовал Внедрение зависимостей - ButterKnife, и эта проблема возникла из-за того, что я не привязал представление.

Итак, внутри onCreate () я просто вставил эту строку:

ButterKnife.bind(this);

Мое объявление RecyclerView с внедрением зависимостей:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;
person rohegde7    schedule 06.01.2019

Для тех, кто использует: реализацию 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

убедитесь, что вы используете это в своем макете xml

У меня также произошел сбой при запуске моего приложения ниже API 27. Вот ссылка на сообщение

Первоначально я создал стиль для изменения размера шрифта моего текстового представления внутри recyclerview, поэтому я создал этот код ниже: (я мог бы просто вызвать @dimen при изменении размера шрифта в зависимости от размеров экрана)

Внутри style.xml

и добавил это в свою тему

themes.xml

После расследования я обнаружил, что именно он вызывает у меня ошибку, и после удаления стиля у меня больше не возникает сбоев.

Я попробовал все возможные решения, которые я нашел здесь в переполнении стека, и почти отказался от этого, к счастью, из моего любопытства я подумал, почему бы не удалить стиль, возможно, это вызывает сбой, а затем бум сбой исчез.

person Jeanne vie    schedule 17.10.2019
comment
Пожалуйста, включите примеры кода напрямую, а не ссылайтесь на изображения. Взгляните на раздел «Помогите другим воспроизвести проблему»: stackoverflow.com/help/how-to-ask - person Chris B; 17.10.2019
comment
Я действительно за это @ChrisB. Я впервые оставляю здесь комментарий, так как моя репутация, как вы видите, слишком низкая. Я столкнулся с аварией сегодня, и я подумал опубликовать здесь, поскольку, возможно, есть люди, которые также сталкиваются с этим, особенно они используют 'androidx.recyclerview: recyclerview: 1.1.0-beta05'. - person Jeanne vie; 17.10.2019

Поскольку LinearLayoutManager по умолчанию является вертикальным, более простой способ сделать это:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Если вы хотите изменить ориентацию, вы можете использовать этот конструктор:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
person l-l    schedule 25.02.2015
comment
теперь у меня есть странный менеджер Issulinearlayout. Я создаю его, но по-прежнему вызывает эту ошибку. святая корова. - person filthy_wizard; 06.06.2016

Думаю проблема в твоем Adapter. Убедитесь, что вы вернули ViewHolder в onCreateViewHolder(). Как показано ниже:

@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;
}
person Android Dev    schedule 18.04.2017

Для меня проблема заключалась в моем activity_main.xml (21), в котором у recycleView не было идентификатора.

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

person David Kathoh    schedule 26.10.2018

В моем случае я добавил только библиотеку масляного ножа и забыл добавить annotationProcessor. Добавив строку ниже в build.gradle (модуль приложения), я решил мою проблему.

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
person Pooja    schedule 21.05.2019

Recyclerview recylerview = findbyid (R.id.recyclerview) Возможно, вы это пропустили

person Sadique Khan    schedule 25.07.2019
comment
Привет, добро пожаловать в SO! Пожалуйста, объясните, почему это актуально для этого вопроса. В настоящее время трудно сказать, о чем вы говорите. - person Piotr Kamoda; 25.07.2019

У меня была аналогичная проблема, когда я тестировал свое приложение на GenyMotion. После перезагрузки устройства в GenyMotion проблема была решена

person Yurii Mikhailichenko    schedule 21.11.2019

Я столкнулся с той же проблемой, потому что у меня был RecyclerView в другом макете, а не в activity_main.xml.

Путем поиска на некоторых сайтах я кое-что получил, и мне захотелось поделиться здесь

  1. Добавить идентификатор для включения тега в Activity_main.xml

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

  2. вызовите этот макет перед поиском представления по идентификатору в MainActivity.java

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

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

person Nupoor    schedule 11.05.2020

У меня была эта проблема при использовании Butterknife, я использовал фрагмент

Для фрагмента это должно быть ButterKnife.bind(this,view);

Для деятельности ButterKnife.bind(this);

person Anjana    schedule 13.10.2020

Если я где-нибудь сделаю это. onView (withId (android.R.id.list)). выполнить (RecyclerViewActions.scrollToPosition (3)); android.R.id.list измените его на свой идентификатор списка, и позиция будет вашей позицией внутри вашего массива.

person keti    schedule 19.08.2018

используя фрагмент

написание кода в onCreateView ()

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

используя деятельность

написание кода в onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

person sajid    schedule 21.05.2019