Android Robolectric Click Recycler Посмотреть объект

Есть ли способ симулировать клик по RecyclerView товар с Robolectric?

До сих пор я пытался получить View в первом видимом положении RecyclerView, но это всегда null, Это getChildCount() продолжает возвращаться 0, а также findViewHolderForPosition всегда null, Адаптер возвращает ненулевой номер из getItemCount() (в адаптере обязательно есть предметы).

Я использую Robolectric 2.4 SNAPSHOT.

4 ответа

Решение

Похоже, проблема была в том, что RecyclerView нужно измерить и выложить вручную в Robolectric. Вызов этого решает проблему:

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

С Robolectric 3 вы можете использовать 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();

Это исключает необходимость запуска измерения вида вручную.

Расширяя ответ Марко Хертвига:

Вам нужно добавить recyclerView к действию, чтобы его методы макета вызывались, как и ожидалось. Вы можете вызвать их вручную (как в ответе Elizer), но вам придется управлять состоянием самостоятельно. Кроме того, это не будет имитировать фактический вариант использования.

Код:

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

Теперь вам не нужно беспокоиться о звонке layout а также measure каждый раз, когда ваш recyclerView обновляется (путем добавления / удаления элементов из adapter, например).

Просто вызовите

      Robolectric.flushForegroundThreadScheduler()

перед выполнитьClick(), чтобы убедиться, что все операции пользовательского интерфейса (включая этапы измерения и макета представления ресайклера после заполнения набором данных) завершены

Другие вопросы по тегам