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(), чтобы убедиться, что все операции пользовательского интерфейса (включая этапы измерения и макета представления ресайклера после заполнения набором данных) завершены