Android Robolectric Click RecyclerVer artículo
android-recyclerview (3)
Parece que el problema era que RecyclerView necesita medirse y distribuirse manualmente en Robolectric. Llamar a esto resuelve el problema:
recyclerView.measure(0, 0);
recyclerView.layout(0, 0, 100, 10000);
¿Hay alguna manera de simular un clic en un elemento RecyclerView con Robolectric?
Hasta ahora, he intentado obtener la View en la primera posición visible de RecyclerView , pero eso siempre es null . Es getChildCount() sigue devolviendo 0 , y findViewHolderForPosition es siempre null . El adaptador devuelve un número distinto de 0 de getItemCount() (definitivamente hay elementos en el adaptador).
Estoy usando Robolectric 2.4 SNAPSHOT.
Con Robolectric 3 puedes usar visible ():
ActivityController<MyActivity> activityController = Robolectric.buildActivity(MyActivityclass);
activityController.create().start().visible();
ShadowActivity myActivityShadow = shadowOf(activityController.get());
RecyclerView currentRecyclerView = ((RecyclerView) myActivityShadow.findViewById(R.id.myrecyclerid));
currentRecyclerView.getChildAt(0).performClick();
Esto elimina la necesidad de activar manualmente la medición de la vista.
Ampliando la respuesta de Marco Hertwig :
Debe agregar recyclerView a una actividad para que sus métodos de diseño se llamen como se espera. Podrías llamarlos manualmente, (como en la respuesta de Elizer ) pero tendrías que administrar el estado tú mismo. Además, esto no simularía un caso de uso real.
Código:
@Before
public void setup() {
ActivityController<Activity> activityController =
Robolectric.buildActivity(Activity.class); // setup a default Activity
Activity activity = activityController.get();
/*
Setup the recyclerView (create it, add the adapter, add a LayoutManager, etc.)
...
*/
// set the recyclerView object as the only view in the activity
activity.setContentView(recyclerView);
// start the activity
activityController.create().start().visible();
}
Ahora no tiene que preocuparse por llamar al layout y measure cada vez que su recyclerView se actualice (agregando / eliminando elementos del adapter , por ejemplo).