Ответ 1
Похоже, проблема заключалась в том, что RecyclerView
необходимо измерить и выложить вручную в Robolectric. Вызов этого решает проблему:
recyclerView.measure(0, 0);
recyclerView.layout(0, 0, 100, 10000);
Есть ли способ имитировать щелчок на элементе RecyclerView
с помощью Robolectric?
До сих пор я пытался получить View
в первой видимой позиции RecyclerView
, но это всегда null
. Он getChildCount()
продолжает возвращать 0
, а findViewHolderForPosition
всегда null
. Адаптер возвращает не-0 номер из getItemCount()
(в адаптере есть определенные элементы).
Я использую Robolectric 2.4 SNAPSHOT.
Похоже, проблема заключалась в том, что 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
в действие, чтобы его методы компоновки вызывались как ожидалось. Вы можете называть их вручную (например, в ответе Элизера), но вам придется управлять самим государством. Кроме того, это не будет имитировать фактический прецедент.
код:
@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
).