Android Robolectric点击RecyclerView项目

时间:2014-11-21 01:46:46

标签: android robolectric android-recyclerview

有没有办法用Robolectric模拟RecyclerView项目上的点击?

到目前为止,我已尝试将View置于RecyclerView的第一个可见位置,但始终为null。它的getChildCount()不断返回0findViewHolderForPosition始终为null。适配器从getItemCount()返回一个非0数字(适配器中肯定有项目)。

我使用的是Robolectric 2.4 SNAPSHOT。

4 个答案:

答案 0 :(得分:39)

似乎问题是RecyclerView需要在Robolectric中手动测量和布局。调用此方法可以解决问题:

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

答案 1 :(得分:6)

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

这消除了手动触发视图测量的需要。

答案 2 :(得分:1)

扩展 Marco Hertwig 的回答:

您需要将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时都会调用measurerecyclerView(例如,通过添加/删除adapter中的项目)

答案 3 :(得分:1)

直接调用

Robolectric.flushForegroundThreadScheduler()

在 performClick() 之前确保所有 ui 操作(包括填充数据集后回收器视图的测量和布局阶段)完成