2016-09-03 28 views
6

Có cách nào để cuộn đến cuối recyclerview bằng Espresso không?Espresso: Recyclerview cuộn đến cuối

Có một mục có văn bản giả sử 'Văn bản XYZ' và recyclerview có id recycler_view. Mục này xảy ra là mục cuối cùng của chế độ xem của người tái chế.

tôi đã cố gắng

onView(withId(R.id.recycler_view)).check(matches(isDisplayed())).perform(RecyclerViewActions.scrollTo(withText("Text XYZ")),click()); 

Nhưng điều này dường như không làm việc. Bất kỳ ý tưởng?

+0

dường như không hoạt động - nhật ký lỗi, vui lòng – piotrek1543

+0

bạn đang kiểm tra chế độ xem đó được hiển thị trước khi cuộn đến đó. – denys

+0

@denys ckeck là cho recyclerview thực tế. Nó không nên thực hiện bất kỳ sự khác biệt trừ khi recyclerview không thực sự được hiển thị. –

Trả lời

13

RecyclerViewActions.scrollTo() đối sánh với số ItemView của số ViewHolder, được tăng thêm trong số onCreateViewHolder() của bộ điều hợp. Và để scrollTo() hoạt động, bạn cần phải cung cấp đối sánh xác định duy nhất rằng ItemView.

Trình kết hợp hiện tại của bạn cho espresso cuộn đến ViewHolder đã được tăng thêm với TextView làm itemView. Điều này có thể xảy ra, nhưng thường bạn có một số hành động ViewGroup đang diễn ra ở đó để tạo kiểu cho người xem theo cách bạn muốn họ xem.

Nếu bạn thay đổi scrollTo() Matcher, thành hasDescendant(withText("Text XYZ")) để tính tất cả bố cục lồng nhau (nếu có nhiều bố cục).

Cũng nên nhớ kể từ khi bạn cũng đang cố gắng để nhấp vào mục - bạn không thể làm điều đó trong cùng perform() bởi vì nó sẽ gửi các nhấp chuột vào dòng ViewInteraction, đó là trong trường hợp này một RecyclerView với id R.id.recycler_view. Làm như vậy trong cùng một thao tác chỉ cần nhấp vào giữa trên RecyclerView, không phải là mục bạn đã cuộn đến.

Để giải quyết vấn đề này, bạn cần phải cần một số onView() khác với trình ghép mà bạn đã sử dụng để cuộn đến một mục hoặc sử dụng RecyclerView.actionOnItem().

Trong trường hợp câu lệnh onView() khác, hasDescendant(withText("Text XYZ")) sẽ không thành công, vì nó sẽ tìm tất cả cha mẹ của TextView đó (xem, recyclerview, viewgroup chứa recyclerview và vv) vì tất cả đều có hậu duệ cụ thể này. Điều này sẽ buộc bạn phải làm cho đối sánh ItemView chính xác hơn và chiếm tất cả bố cục lồng nhau. Thông thường của tôi đi đến matcher là withChild() trong những tình huống này, nhưng nó có thể khác nhau cho bạn.

+0

Tuyệt vời, cảm ơn, hoạt động hoàn hảo! Nên được smth như onView này (withId (R.id.rvSettings)) kiểm tra (phù hợp (isDisplayed())) thực hiện (RecyclerViewActions.scrollTo (hasDescendant (withText (stringId)))); –

Các vấn đề liên quan