Я пытаюсь возиться с новым 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)
onCreateView
то, что вы удаляете / уничтожаете / отменяете регистрациюonDestroyView
... Надо следовать этим жизненным циклам!Ответы:
Эта проблема обычно возникает, если
LayoutManager
дляRecyclerView
. Сделать это можно так:final LinearLayoutManager layoutManager = new LinearLayoutManager(context); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager);
источник
final
, поэтому я объявил ееfinal
здесь.В моем случае это было связано не с «финалом», а с проблемой, упомянутой в комментарии @ 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);
источник
LayoutManager
не было предоставлено , вот и все. Вы можете сделать переменную указывающей наLayoutManager
final или not final - это ничего не меняет.Для меня у меня была такая же проблема, проблема заключалась в том, что в 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" />
источник
Я испытал этот сбой, хотя у меня был
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); }
источник
RecyclerView
код инициализации вonViewCreated(...)
работавшегоВам нужно использовать
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)); }
источник
У меня возникла эта проблема из-за неправильной ссылки на
RecyclerView
идентификатор.к
источник
Уточните у вас идентификатор представления ресайклера, указав, что фактическое представление ресайклера решило мою проблему
источник
Моя проблема заключалась в моем XML Lyout, у меня есть android: animateLayoutChanges установлено значение true, и я вызвал notifyDataSetChanged () в адаптере RecyclerView в коде Java.
Итак, я только что удалил android: animateLayoutChanges из моего макета, и это решило мою проблему.
источник
У меня была эта проблема при использовании библиотеки 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);
источник
В 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);
источник
Я использовал инъекцию зависимостей - ButterKnife и эта проблема возникла из-за того, что я не привязал представление.
Итак, внутри onCreate () я просто вставил эту строку:
ButterKnife.bind(this);
Мое объявление RecyclerView с внедрением зависимостей:
@BindView(R.id.recyclerview) RecyclerView recyclerView;
источник
Для тех, кто использует: реализацию 'androidx.recyclerview: recyclerview: 1.1.0-beta05'
убедитесь, что вы используете это в своем макете xml
У меня также произошел сбой при запуске моего приложения ниже API 27. Вот ссылка на сообщение
Первоначально я создал стиль для изменения размера шрифта моего текстового представления внутри recyclerview, поэтому я создал этот код ниже: (я мог бы просто вызвать @dimen при изменении размера шрифта в зависимости от размеров экрана)
Внутри style.xml
и добавил это в мою тему
themes.xml
После расследования я обнаружил, что именно он вызывает у меня ошибку, и после удаления стиля я больше не испытываю сбоев.
Я пробовал все возможные решения, которые нашел здесь в переполнении стека, и почти отказался от этого, к счастью, из-за моего любопытства я подумал, почему бы не удалить стиль, возможно, это вызывает сбой, а затем бум сбой исчез.
источник
Поскольку LinearLayoutManager по умолчанию вертикальный, более простой способ сделать это:
recyclerView.setLayoutManager(new LinearLayoutManager(context));
Если вы хотите изменить ориентацию, вы можете использовать этот конструктор:
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
источник
Думаю проблема в вашем
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; }
источник
Для меня проблема заключалась в моем 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
источник
В моем случае я добавил только библиотеку масляного ножа и забыл добавить annotationProcessor. Добавив строку ниже в build.gradle (модуль приложения), я решил мою проблему.
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
источник
Recyclerview recylerview = findbyid (R.id.recyclerview) Возможно, вы это пропустили
источник
У меня была аналогичная проблема, когда я тестировал свое приложение на GenyMotion. После перезагрузки устройства в GenyMotion проблема была решена
источник
Я столкнулся с той же проблемой, потому что у меня был RecyclerView в другом макете, а не в activity_main.xml.
Путем поиска на некоторых сайтах я кое-что получил, и мне захотелось поделиться здесь
Добавить идентификатор для включения тега в Activity_main.xml
<include id="includedRecyclerLayout" .... </include>
вызовите этот макет перед поиском представления по идентификатору в MainActivity.java
`ConstraintLayout includedLayout = findViewById (R.id.inckudedRecyclerLayout);
RecyclerViewrecyclerview = includedLayout.findViewById (R.id.RECYCLER_VIEW_ID) `;
источник
У меня была эта проблема при использовании Butterknife, я использовал фрагмент
Для фрагмента это должно быть
ButterKnife.bind(this,view);
Для деятельности
ButterKnife.bind(this);
источник
Если я где-нибудь сделаю это. onView (withId (android.R.id.list)). выполнить (RecyclerViewActions.scrollToPosition (3)); android.R.id.list измените его на свой идентификатор списка, и позиция будет вашей позицией внутри вашего массива.
источник
написание кода в onCreateView ()
RecyclerView recyVideo = view.findViewById (R.id.recyVideoFag);
написание кода в onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);
источник