NPE @ android.support.v7.widget.RecyclerView $ LayoutManager.detachViewInternal

Al conmutar del espresso 2.0 a 2.1 estoy tropezando uppon este error extraño:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.ChildHelper.detachViewFromParent(int)' on a null object reference at android.support.v7.widget.RecyclerView$LayoutManager.detachViewInternal(RecyclerView.java:5407) at android.support.v7.widget.RecyclerView$LayoutManager.detachViewAt(RecyclerView.java:5400) at android.support.v7.widget.RecyclerView.setAdapterInternal(RecyclerView.java:647) at android.support.v7.widget.RecyclerView.swapAdapter(RecyclerView.java:594) at org.ligi.passandroid.ui.PassListActivity.onCreate(PassListActivity.java:161) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:489) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) 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:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

El código allí:

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.pass_list); ButterKnife.inject(this); AXT.at(openFileFAB).setVisibility(Build.VERSION.SDK_INT >= VERSION_STARTING_TO_SUPPORT_STORAGE_FRAMEWORK); final LinearLayoutManager llm = new LinearLayoutManager(this); llm.setOrientation(LinearLayoutManager.VERTICAL); (!!here!!) recyclerView.setLayoutManager(llm); 

No se está estrellando allí cuando acabo de ejecutar la aplicación o la prueba con espresso 2.0

One Solution collect form web for “NPE @ android.support.v7.widget.RecyclerView $ LayoutManager.detachViewInternal”

Este es un tema extraño, por lo que voy a dar una resolución que funcionó para mí primero y luego tratar de explicar lo que creo que está sucediendo.

Solución rápida es redeclare sus dependencias de la biblioteca de soporte técnico en la configuración de compilación de prueba:

 androidTestCompile 'com.android.support:support-v4:22.1.1' androidTestCompile 'com.android.support:appcompat-v7:22.1.1' androidTestCompile 'com.android.support:cardview-v7:22.1.1' androidTestCompile 'com.android.support:gridlayout-v7:22.1.1' androidTestCompile 'com.android.support:recyclerview-v7:22.1.1' 

Esto debería solucionar el problema.

La explicación es bastante extraña: parece un espresso-contrib:2.1 depende de una versión anterior de com.android.support:recyclerview-v7:22.0.0 . Esto se puede comprobar con la aplicación de Gradle : dependencias task: ./gradlew app:dependencies . De alguna manera esta dependencia tiene precedencia sobre la declarada en la compilación y la tira abajo a la versión más vieja:

 +--- com.android.support.test.espresso:espresso-contrib:2.1 | +--- com.android.support:recyclerview-v7:22.0.0 | | \--- com.android.support:support-v4:22.0.0 | +--- com.android.support:support-v4:22.0.0 | \--- com.android.support.test.espresso:espresso-core:2.1 (*) 

Esto se puede confirmar mediante la aplicación: dependencyInsight tarea: ./gradlew app:dependencyInsight --configuration androidTestCompile --dependency recyclerview-v7

 com.android.support:recyclerview-v7:22.0.0 \--- com.android.support.test.espresso:espresso-contrib:2.1 \--- androidTestCompile 

El resultado es que la versión de prueba utiliza una versión diferente (de pedido) de recyclerview-v7 que resulta ser buggy. La adición de androidTestCompile ayuda a Gradle a detectar el conflicto y resolverlo correctamente. Después de la corrección:

 com.android.support:recyclerview-v7:22.1.1 (conflict resolution) \--- androidTestCompile com.android.support:recyclerview-v7:22.0.0 -> 22.1.1 \--- com.android.support.test.espresso:espresso-contrib:2.1 \--- androidTestCompile 
  • ¿Cómo depurar las pruebas de instrumentación en Android Studio?
  • La interfaz de usuario de Espresso se ejecuta cuando ejecuto una sola prueba, pero falla cuando ejecuto un conjunto de pruebas
  • Uso del Espresso a la prueba unitaria Google Maps
  • Espresso - haga clic en el botón del diálogo
  • ¿Cómo conseguir que Spoon tome capturas de pantalla para las pruebas de Espresso?
  • Prueba de interfaz de usuario de Android Fingerprint con Espresso
  • Espresso y postDelayed
  • Android Espresso onData con doesNotExist
  • Espresso: cómo desplazarse a la parte inferior de ScrollView
  • PerformException: Error al realizar 'solo clic'
  • Espresso + Junit4 - iniciar sesión una vez antes de ejecutar todas las pruebas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.