有没有办法用Robolectric模拟RecyclerView
项目上的点击?
到目前为止,我已尝试将View
置于RecyclerView
的第一个可见位置,但始终为null
。它的getChildCount()
不断返回0
,findViewHolderForPosition
始终为null
。适配器从getItemCount()
返回一个非0数字(适配器中肯定有项目)。
我使用的是Robolectric 2.4 SNAPSHOT。
答案 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
时都会调用measure
和recyclerView
(例如,通过添加/删除adapter
中的项目)
答案 3 :(得分:1)
直接调用
Robolectric.flushForegroundThreadScheduler()
在 performClick() 之前确保所有 ui 操作(包括填充数据集后回收器视图的测量和布局阶段)完成