Ошибка приложения при попытке использовать RecyclerView на Android 5.0
Я пытаюсь запутаться в новом RecyclerView, и всякий раз, когда я пытаюсь запустить его, мое приложение сразу же падает. Это дает мне NullPointerException для попытки доступа к методам из android.support.v7.widget.RecyclerView
. Я смотрел на другие сообщения и видел, что у большинства людей не было compile 'com.android.support:recyclerview-v7:+'
, но я пробовал это, и он совсем не помог. Не совсем уверен, что делать в этот момент, любая помощь будет оценена. Здесь журнал ошибок: (я бы опубликовал фотографию, но у меня еще нет 10 rep)
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)
Ответы
Ответ 1
Эта проблема обычно возникает, когда LayoutManager
предоставлен для RecyclerView
. Вы можете сделать это так:
final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
Ответ 2
В моем случае это не было связано с "финалом", но к вопросу, упомянутому в комментарии @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);
Ответ 3
Для меня у меня была такая же проблема, проблема заключалась в том, что в xml был использован неиспользуемый RecyclerView, но я не привязываю его к любому адаптеру в Activity, поэтому проблема. Он был решен, как только я удалил такие неиспользуемые виды recycler в xml
i.e - я удалил это представление, поскольку это не было вызвано в коде или какой-либо адаптер был установлен
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rv_profileview_allactivities"
android:visibility="gone" />
Ответ 4
Я испытал этот крах, хотя у меня был правильный набор 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);
}
Ответ 5
Вам нужно использовать 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));
}
Ответ 6
Я получил эту проблему из-за неправильной ссылки на RecyclerView
id.
recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);
к
recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
Ответ 7
recyclerView =
(RecyclerView) findViewById(R.id.recycler_view2);
Проверьте с вами идентификатор просмотра recycler, указав на реальный просмотр ресайклеров, решив мою проблему.
Ответ 8
Моя проблема была в моем XML файле. У меня есть параметр android: animateLayoutChanges, установленный в true, и я вызвал notifyDataSetChanged() в адаптере RecyclerView в коде Java.
Итак, я только что удалил android: animateLayoutChanges из моего макета и решил проблему.
Ответ 9
У меня была эта проблема при использовании библиотеки 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);
Ответ 10
Я использовал инъекцию зависимостей - ButterKnife, и эта проблема возникла из-за того, что я не связал представление.
Так что внутри onCreate() я просто вставил эту строку:
ButterKnife.bind(this);
Моя декларация RecyclerView с внедрением зависимостей:
@BindView(R.id.recyclerview)
RecyclerView recyclerView;
Ответ 11
Так как LinearLayoutManager по умолчанию по вертикали, более простой способ сделать это:
recyclerView.setLayoutManager(new LinearLayoutManager(context));
Если вы хотите изменить ориентацию, вы можете использовать этот конструктор:
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
Ответ 12
Я думаю, проблема в вашем 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;
}
Ответ 13
package com.example.om.recycler_view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Movie>movieList= new ArrayList<>();
private RecyclerView recyclerView;
private MoviesAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
mAdapter=new MoviesAdapter(movieList);
RecyclerView.LayoutManager mLayoutManager= new LinearLayoutManager(this);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
prepareMovieData();
}
private void prepareMovieData() {
Movie movie=new Movie("Mad Max: Fury Road", "Action & Adventure", "2015");
movieList.add(movie);
movie = new Movie("Star Wars: Episode VII - The Force Awakens", "Action", "2015");
movieList.add(movie);
movie = new Movie("Shaun the Sheep", "Animation", "2015");
movieList.add(movie);
movie = new Movie("The Martian", "Science Fiction & Fantasy", "2015");
movieList.add(movie);
movie = new Movie("Mission: Impossible Rogue Nation", "Action", "2015");
movieList.add(movie);
movie = new Movie("Up", "Animation", "2009");
movieList.add(movie);
movie = new Movie("Star Trek", "Science Fiction", "2009");
movieList.add(movie);
movie = new Movie("The LEGO Movie", "Animation", "2014");
movieList.add(movie);
movie = new Movie("Iron Man", "Action & Adventure", "2008");
movieList.add(movie);
movie = new Movie("Aliens", "Science Fiction", "1986");
movieList.add(movie);
movie = new Movie("Chicken Run", "Animation", "2000");
movieList.add(movie);
movie = new Movie("Back to the Future", "Science Fiction", "1985");
movieList.add(movie);
movie = new Movie("Raiders of the Lost Ark", "Action & Adventure", "1981");
movieList.add(movie);
movie = new Movie("Goldfinger", "Action & Adventure", "1965");
movieList.add(movie);
movie = new Movie("Guardians of the Galaxy", "Science Fiction & Fantasy", "2014");
movieList.add(movie);
mAdapter.notifyDataSetChanged();
}
}
ERROR is:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.om.recycler_view/com.example.om.recycler_view.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2348)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2410)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5345)
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:947)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
at com.example.om.recycler_view.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:6012)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2410)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1313)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5345)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
How can solve???????
Ответ 14
Для меня проблема была с моим 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"
/>
Это сработало, когда я добавил андроид: id = "@+id/transac_recycler_view" в activity_main.xml(21) recycleView
Ответ 15
В 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);
Ответ 16
В моем случае я добавил только библиотеку butterknife и забыл добавить annotationProcessor. Добавив строку ниже в build.gradle (модуль приложения), решил мою проблему.
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
Ответ 17
Recyclerview recylerview = findbyid (R.id.recyclerview) Может быть, вы его пропустили
Ответ 18
Для тех, кто использует: реализацию 'androidx.recyclerview: recyclerview: 1.1.0-beta05'
убедитесь, что вы используете это в своем макете XML
Я также испытал сбой при запуске моего приложения ниже API 27. Здесь ссылка на сообщение
Первоначально я создал стиль для изменения размера шрифта моего текстового представления в представлении реселлера, поэтому я создал следующий код: (я мог бы просто назвать @dimen при изменении размера шрифта в зависимости от размеров экрана)
Внутри style.xml
и добавил это в мою тему
themes.xml
Проведя расследование, я обнаружил, что именно он вызывает у меня ошибку, и после удаления стиля у меня больше не происходит сбой.
Я перепробовал все возможные решения, которые я нашел здесь, в переполнении стека, и почти отказался от этого, к счастью, из любопытства я подумал, почему бы не удалить стиль, возможно, это приведет к сбою, а затем к буму сбоев больше нет.
Ответ 19
Если я, где ты, я сделаю это. OnView (withId (android.R.id.list)) выполняют (RecyclerViewActions.scrollToPosition(3)). android.R.id.list измените его на свой идентификатор списка, и позиция будет вашей позицией внутри вашего массива.
Ответ 20
используя фрагмент
написание кода в onCreateView()
RecyclerView recyVideo = view.findViewById(R.id.recyVideoFag);
используя деятельность
написание кода в onCreate() RecyclerView recyVideo = findViewById (R.id.recyVideoFag);