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

При переключении с espresso 2.0 на 2.1 я наткнулся на эту странную ошибку:

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) 

Код там:

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

Это не сбой там, когда я просто запускаю приложение или тестирую его с помощью espresso 2.0

Это странная проблема, поэтому я дам разрешение, которое сработало для меня сначала, а затем попытаюсь объяснить, что я думаю, что происходит.

Быстрое исправление заключается в обновлении зависимостей библиотеки поддержки в конфигурации тестовой сборки:

 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' 

Это должно решить вашу проблему.

Объяснение довольно странное: выглядит как espresso-contrib:2.1 зависит от более старой версии com.android.support:recyclerview-v7:22.0.0 . Это можно проверить с помощью приложения Gradle app: dependencies : ./gradlew app:dependencies . Так или иначе, эта зависимость имеет приоритет над объявленной в компиляции и переносит ее на более старую версию:

 +--- 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 (*) 

Это можно подтвердить с помощью приложения: dependencyInsight task: ./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 

В результате тестовая сборка использует другую (упорядоченную) версию recyclerview-v7 которая оказывается неисправной. Добавление androidTestCompile помогает Gradle обнаруживать конфликт и правильно его решать. После исправления:

 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