Подтвердить что ты не робот

Android Robolectric Щелкните элемент RecyclerView

Есть ли способ имитировать щелчок на элементе RecyclerView с помощью Robolectric?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Развернувшись на ответе Марко Хертвига:

Вам нужно добавить 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).