android robolectric android-recyclerview

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