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