web-dev-qa-db-ja.com

Espresso Recyclerviewスクロールして最後まで

私はAndroidアプリケーションにN個の要素を持つRecyclerViewがあり、このRecyclerViewがスクロール時に終了に達すると、さらに要素が追加されます(したがって、スクロールに到達するとデータをロードする無限リストです)ボトム)。

これをテストしたいのですが、これを行う方法が見つかりません。 scrollToPositionを持つRecyclerViewActionsを使用していますが、最後の位置を配置しても、最後に到達しません(各要素の高さが高いため)。

誰か私がこれをどうやってできるのか知っていますか?

10
LordWater

以下を使用して、RecyclerViewの一番下までスクロールします。

_activity = mActivityTestRule.launchActivity(startingIntent);

onView(withId(R.id.recyclerView))
                .perform(RecyclerViewActions.scrollToPosition(activity.recyclerView.getAdapter().getItemCount() - 1));
_

次に、さらにデータがロードされたときに、 アイドルリソース (またはThread.sleep())を使用してこれを再度呼び出す必要があります。

20
Josh Laird

私はこれを使います。

 // Get total item of myRecyclerView
RecyclerView recyclerView = mActivityTestRule.getActivity().findViewById(R.id.myRecyclerView);
int itemCount = recyclerView.getAdapter().getItemCount();

Log.d("Item count is ", String.valueOf(itemCount));

// Scroll to end of page with position
onView(withId(R.id.myRecyclerView))
    .perform(RecyclerViewActions.scrollToPosition(itemCount - 1));
4
scll

viewActionを実装できます。このような:

class ScrollToBottomAction : ViewAction {
override fun getDescription(): String {
    return "scroll RecyclerView to bottom"
}

override fun getConstraints(): Matcher<View> {
    return allOf<View>(isAssignableFrom(RecyclerView::class.Java), isDisplayed())
}

override fun perform(uiController: UiController?, view: View?) {
    val recyclerView = view as RecyclerView
    val itemCount = recyclerView.adapter?.itemCount
    val position = itemCount?.minus(1) ?: 0
    recyclerView.scrollToPosition(position)
    uiController?.loopMainThreadUntilIdle()
}
}

次のように使用します。

onView(withId(R.id.recyclerView)).perform(ScrollToBottomAction())
4
chunping mu