La aplicación se bloquea al intentar usar RecyclerView en Android 5.0

91

Estoy tratando de jugar con el nuevo RecyclerView y cada vez que intento ejecutarlo, mi aplicación se bloquea inmediatamente. Me da NullPointerException para intentar acceder a métodos desde android.support.v7.widget.RecyclerView. Miré otras publicaciones y vi que la mayoría de la gente no tenía, compile 'com.android.support:recyclerview-v7:+'pero lo intenté y no ayudó en absoluto. No estoy seguro de qué hacer en este momento, se agradecería cualquier ayuda. Aquí el registro de errores: (Publicaría una imagen pero todavía no tengo 10 repeticiones)

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)
Joe
fuente
para cualquiera que tenga este error causado por pestañas de Viewpager, vea esta solución
Hassan Gilak
¿Ha resuelto esto? .Por favor ayúdenme, tengo el mismo problema
Sagar
Recuerda configurar / crear / registrar en onCreateViewlo que eliminas / destruyes / anulas el registro onDestroyView... ¡Debes seguir esos ciclos de vida!
Sakiboy

Respuestas:

211

Este problema suele ocurrir cuando no LayoutManagerse proporcionó ningún archivo RecyclerView. Puedes hacerlo así:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
aga
fuente
14
No creo que tenga que ser definitivo, así que no creo que ese sea el problema. En mi caso, estaba implementando un fragmento con recyclerView y traté de retener una referencia de onCreateView y establecer un layoutManager más tarde cuando se cargan los datos. Tuve este problema y desapareció cuando configuré el layoutManager anteriormente en el método gamein onCreateView.
Nemanja Kovacevic
3
@ NemanjaKovačević bueno, supongo que cada variable que no necesita ser cambiada más tarde tiene que declararse como final, por eso la he declarado finalaquí.
AGA
2
Dado que LinearLayoutManager es vertical de forma predeterminada, puede usar: recyclerView.setLayoutManager (new LinearLayoutManager (context));
ll
1
Gracias a Dios que podemos buscar en Google los mismos mensajes de error que crea Google para que tengan sentido.
jhegedus
1
@wesleyfranks es difícil saber por qué está obteniendo una referencia de objeto nulo sin mirar 1. el código que configura RecyclerView y 2. el seguimiento de pila que está obteniendo después del bloqueo. :)
aga
26

En mi caso, no estaba conectado a 'final', sino al problema mencionado en el comentario de @ NemanjaKovačević a la respuesta de @aga. Estaba configurando un layoutManager en la carga de datos y esa fue la causa del mismo bloqueo. Después de mover la configuración de layoutManager a onCreateView de mi fragmento, se solucionó el problema.

Algo como esto:

@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);
YuriK
fuente
1
Una vez más: no digo que este problema esté relacionado de alguna manera con que la variable no sea definitiva. El problema es que LayoutManager no se proporcionó , eso es todo. Puede hacer que la variable apunte a LayoutManagerfinal, o no final, no cambia nada.
aga
@Yurik estoy usando recyclerview en Activity no en fragment. cual es el caso para mi?
Youri
@Youri, creo que debería colocar la configuración de layoutManager en el onCreate de su actividad.
YuriK
10

Para mí, estaba teniendo el mismo problema, el problema era que había un RecyclerView sin usar en xml con la vista desaparecida, pero no lo estoy vinculando a ningún adaptador en Activity, de ahí el problema. Se resolvió tan pronto como eliminé esas vistas de reciclador no utilizadas en xml

es decir, eliminé esta vista porque no se llamó en el código o se configuró algún adaptador

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_profileview_allactivities"
        android:visibility="gone" />
Maurice
fuente
Lo mismo aquí todo fue perfecto, pero no funcionaba. Así que eliminé las vistas de reciclaje no utilizadas y funcionó sin ningún problema. Gracias hombre @Maurice ^^
Bhupinder
1
después de perder un día probé su solución y funcionó: D [:( mi tiempo se desperdició]
mfaisalhyder
8

Experimenté este accidente a pesar de que tenía el RecyclerView.LayoutManagerajuste correcto. Tuve que mover el RecyclerView código de inicialización a la onViewCreated(...)devolución de llamada para solucionar este problema.

@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);
}
Shirish Kamath
fuente
2
Aún así, mi problema no se resuelve: / Probé casi todas las soluciones y sigo obteniendo el mismo error al usar RecyclerView dentro de un fragmento que se mostrará en PagerView :(
mfaisalhyder
¡Increíble! Moviendo el RecyclerViewcódigo de inicialización al onViewCreated(...) trabajado
Marcelo Gracietti
Hice esta solución y todavía era nula para mí. Sin embargo, sigo tratando de averiguar dónde.
Wesley Frank
5

Necesitas usar setLayoutManageren el RecyclerView#onCreate()método. Antes de agregar recyclerViewa una vista, debe tener el LayoutManagerconjunto.

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

}
Katwal-Dipak
fuente
3

Recibí este problema debido a una referencia incorrecta de RecyclerViewidentificación.

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

a

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

Consulte con su ID de vista de reciclador, apuntando a la vista de reciclador real resolvió mi problema

iam_muqshid
fuente
1

Mi problema estaba en mi XML lyout tengo un android: animateLayoutChanges configurado en verdadero y llamé a notifyDataSetChanged () en el adaptador de RecyclerView en el código Java.

Entonces, acabo de eliminar android: animateLayoutChanges de mi diseño y eso resolvió mi problema.

Ahlem Jarrar
fuente
1

Tuve este problema al usar la biblioteca Butterknife. Yo tenía:

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

Pero la versión correcta es:

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

En Gradle, implemente esta biblioteca:

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'

En XML mencione así:

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

En Fragmento usamos recyclerViewasí:

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

En Actividad usamos RecyclerViewasí:

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

si necesitas horizontal RecyclerView haz esto:

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

si desea usar GridLayoutManager usando el RecyclerViewuso de esta manera:

        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);
Abhinav Gupta
fuente
1

Estaba usando una inyección de dependencia - ButterKnife y este problema surgió porque no había enlazado la vista.

Así que dentro de onCreate () acabo de insertar esta línea:

ButterKnife.bind(this);

Mi declaración de RecyclerView con inyección de dependencia:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;
rohegde7
fuente
1

Para aquellos que están usando: implementación 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

asegúrese de que está usando esto en su diseño xml

También experimenté un bloqueo al ejecutar mi aplicación por debajo de API 27. Aquí hay un enlace al mensaje

Originalmente, he creado un estilo para cambiar el tamaño de fuente de mi vista de texto dentro de la vista de reciclaje, por eso creé este código a continuación: (podría haber llamado a @dimen al cambiar el tamaño de fuente según los tamaños de pantalla)

Dentro de style.xml

y agregué esto en mi tema

themes.xml

Después de investigar, descubrí que este es el que me está causando un error y, después de eliminar el estilo, ya no tengo un bloqueo.

Probé todas las soluciones posibles que encontré aquí en el desbordamiento de pila y casi me doy por vencido, afortunadamente en mi curiosidad pensé por qué no eliminar el estilo, tal vez esto cause el bloqueo y luego boom, el bloqueo se ha ido.

Jeanne vie
fuente
1
Incluya ejemplos de código directamente en lugar de vincularlos a imágenes. Eche un vistazo a la sección "Ayude a otros a reproducir el problema": stackoverflow.com/help/how-to-ask
Chris B
1
Realmente estoy a favor de esto @ChrisB. Esta es la primera vez que pongo un comentario aquí porque mi reputación es demasiado baja, como puede ver. Encontré el bloqueo hoy y estaba pensando en publicar aquí, ya que tal vez hay personas que también se enfrentan a esto, especialmente si están usando 'androidx.recyclerview: recyclingview: 1.1.0-beta05'.
Jeanne vie
0

Dado que LinearLayoutManager es vertical de forma predeterminada, una forma más fácil de hacerlo es:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Si desea cambiar la orientación, puede usar este constructor:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
ll
fuente
tener un administrador de diseño de issulinearlayout extraño ahora. Estoy creando una instancia pero aún tengo este error. vaca sagrada.
filthy_wizard
0

Creo que el problema en tu Adapter. Asegúrese de que ha regresado ViewHolderen onCreateViewHolder(). Como abajo:

@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;
}
Desarrollador de Android
fuente
0

Para mí, el problema fue con mi activity_main.xml (21) en el que el recycleView no tenía una identificación.

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

Funcionó cuando agregué un android: id = "@ + id / transac_recycler_view" a activity_main.xml (21) recycleView

David Kathoh
fuente
0

En mi caso, agregué solo la biblioteca butterknife y me olvidé de agregar annotationProcessor. Al agregar la siguiente línea a build.gradle (módulo de la aplicación), resolví mi problema.

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
Pooja
fuente
0

Recyclerview recyclingview = findbyid (R.id.recyclerview) Puede que te lo hayas perdido

Sadique Khan
fuente
Hola, bienvenido a SO! Explique un poco más por qué esto es relevante para esta pregunta. Tal como está escrito actualmente, es difícil decir a qué se refiere.
Piotr Kamoda
0

Tuve un problema similar cuando probé mi aplicación en GenyMotion. Después de reiniciar el dispositivo en GenyMotion, se resolvió el problema

Yurii Mikhailichenko
fuente
0

Enfrenté el mismo problema porque tenía RecyclerView en otro diseño y no en activity_main.xml.

Al buscar en algunos sitios, obtuve algo y tuve ganas de compartir aquí.

  1. Agregar ID para incluir etiqueta en Activity_main.xml

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

  2. Llame a este diseño antes de buscar la vista por ID en MainActivity.java

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

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

Nupoor
fuente
-1

Si yo donde tu haré esto. onView (withId (android.R.id.list)). realizar (RecyclerViewActions.scrollToPosition (3)); android.R.id.list cámbielo a su ID de lista y la posición será su posición dentro de su matriz.

Keti
fuente
-1

usando fragmento

escribiendo código en onCreateView ()

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

usando actividad

escribiendo código en onCreate () RecyclerView recicVideo = findViewById (R.id.recyVideoFag);

dijo
fuente