2014-11-21 12 views
17

Esiste un modo per simulare un clic su un elemento RecyclerView con Robolectric?Android Robolectric Click RecyclerView Item

Finora, ho provato a ottenere View nella prima posizione visibile di RecyclerView, ma è sempre null. È getChildCount() continua a restituire 0 e findViewHolderForPosition è sempre null. L'adattatore restituisce un numero diverso da getItemCount() (ci sono sicuramente degli elementi nell'adattatore).

Sto usando Robolectric 2.4 SNAPSHOT.

risposta

35

Sembra che il problema era che RecyclerView deve essere misurato e disposto manualmente in Robolectric. Chiamando questo risolve il problema:

recyclerView.measure(0, 0); 
recyclerView.layout(0, 0, 100, 10000); 
+1

Questa è una grande scoperta. Grazie per questo. Posso chiederti come hai fatto a scoprire che la visione del riciclatore non è stata misurata e presentata? Sarebbe davvero utile per me. – c05mic

+0

Dove si aggiunge la misura e il layout? dopo findViewById nel test stesso? – Jeroen

+0

Non c'è un posto specifico per farlo; A volte lo faccio dopo 'findViewById', ma di solito lo faccio prima che ne abbia bisogno. – Eliezer

4

Con Robolectric 3 È possibile utilizzare visibile():

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

Questo elimina la necessità di eseguire la misura della vista a mano.

0

Ampliando risposta Marco Hertwig s':

è necessario aggiungere il recyclerView ad un'attività in modo che i suoi metodi di layout sono chiamati come previsto. Potresti chiamarli manualmente (come nella risposta Elizer) ma dovresti gestire tu stesso lo stato. Inoltre, questo non simulerebbe un caso d'uso reale.

Codice:

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

Ora non c'è bisogno di preoccuparsi di chiamare layout e measure ogni vostra recyclerView viene aggiornato (con l'aggiunta/rimozione di elementi dal adapter, per esempio).

Problemi correlati