安卓 Robolectric 点击 RecyclerView 项

23
有没有办法在Robolectric中模拟对RecyclerView项目的点击?目前,我尝试获取RecyclerView中第一个可见位置的View,但始终为null。它的getChildCount()一直返回0,并且findViewHolderForPosition始终为null。适配器从getItemCount()返回非零数字(适配器中肯定有项目)。我正在使用Robolectric 2.4 SNAPSHOT。
4个回答

45

看起来问题是在Robolectric中需要手动测量和布局RecyclerView。调用此方法解决了问题:

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

1
这是一个很好的发现。谢谢你。我可以问一下你是如何发现回收视图没有被测量和布局的吗?这对我来说会非常有帮助。 - c05mic
你在哪里添加测量和布局?是在测试本身的findViewById之后吗? - Jeroen
没有一个特定的地方来做它;我有时会在 findViewById 之后做,但通常会在我需要它之前立即做。 - Eliezer
3
此代码应该被调用的次数与您在适配器上调用notifyDatasetChanged()或类似方法的次数相同,而不仅仅是一次。我曾经遇到过这种情况。 - Vince
嗨@Eliezer,谢谢你的回答。我已经找了一段时间了,这个方法很有效。如果可能的话,你是怎么想到这个方法的?我想知道为了增加我的Android知识。 - Killesk
@Eliezer 谢谢你的回答。这对我很有效。 - Qian Sijianhao

10

使用 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

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

现在你无需担心每次更新RecyclerView(例如添加/删除适配器中的项目)时都需要调用layout和measure。

2

只需调用即可。

Robolectric.flushForegroundThreadScheduler()

在执行performClick()之前,确保所有UI操作(包括使用数据集填充后的Recycler View的测量和布局阶段)都已完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接