Tôi cần biết những phần tử nào hiện đang được hiển thị trong RecyclerView của tôi. Không có tương đương với OnScrollListener.onScroll(...)
phương thức trên ListViews. Tôi đã cố gắng làm việc với View.getGlobalVisibleRect(...)
, nhưng bản hack đó quá xấu và không phải lúc nào cũng hoạt động.
Ai đó có bất kỳ ý tưởng?
Con hiển thị đầu tiên / cuối cùng phụ thuộc vào LayoutManager
. Nếu bạn đang sử dụng LinearLayoutManager
hoặc GridLayoutManager
, bạn có thể sử dụng
int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();
Ví dụ:
GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
Đối với LinearLayoutManager
, đầu tiên / cuối cùng phụ thuộc vào thứ tự bộ chuyển đổi. Không truy vấn trẻ em từ RecyclerView
; LayoutManager
có thể thích bố trí nhiều mục hơn là hiển thị cho bộ nhớ đệm.
Cuối cùng, tôi đã tìm ra giải pháp để biết liệu mục hiện tại có hiển thị hay không, từ sự kiện onBindViewHolder trong bộ điều hợp.
Chìa khóa là phương thức isViewPartiallyVbroken từ LayoutManager.
Trong bộ điều hợp của mình, bạn có thể lấy LayoutManager từ RecyclerView, mà bạn nhận được dưới dạng tham số từ sự kiện onAttachedToRecyclerView .
đối với những người có logic được triển khai bên trong bộ điều hợp RecyclerView, bạn vẫn có thể sử dụng phương pháp @ernesto kết hợp với một trên scrollListener để nhận được what you want
khi RecyclerView được tư vấn. Bên trong bộ điều hợp, bạn sẽ có một cái gì đó như thế này:
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof LinearLayoutManager && getItemCount() > 0) {
LinearLayoutManager llm = (LinearLayoutManager) manager;
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visiblePosition = llm.findFirstCompletelyVisibleItemPosition();
if(visiblePosition > -1) {
View v = llm.findViewByPosition(visiblePosition);
//do something
v.setBackgroundColor(Color.parseColor("#777777"));
}
}
});
}
}
Bạn có thể sử dụng recyclerView.getChildAt()
để lấy từng phần con hiển thị và việc đặt một số thẻ convertview.setTag(index)
trên chế độ xem này trong mã bộ điều hợp sẽ giúp bạn liên kết nó với dữ liệu bộ điều hợp.
Các Linear / Grid LayoutManager
phương pháp sau có thể được sử dụng để kiểm tra các mụcvisible
int findFirstVisibleItemPosition();
int findLastVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();
và nếu bạn muốn theo dõi is item visible on screen
ngưỡng nào đó thì bạn có thể tham khảo blog sau.
https://proandroiddev.com/detecting-list-items-pernition-by-user-8f164dfb1d05
Phụ lục :
Các chức năng đề xuất findLast ... Vị trí () làm không hoạt động chính xác trong một kịch bản với một thanh công cụ bị sụp đổ trong khi thanh công cụ được mở rộng.
Có vẻ như chế độ xem trình tái chế có chiều cao cố định, và trong khi thanh công cụ được mở rộng, trình tái chế được di chuyển xuống dưới, một phần ra khỏi màn hình. Kết quả là kết quả của các chức năng được đề xuất là quá cao. Ví dụ: Mục hiển thị cuối cùng được cho là # 9, nhưng trên thực tế, mục # 7 là mục cuối cùng xuất hiện trên màn hình.
Hành vi này cũng là lý do tại sao chế độ xem của tôi thường không cuộn đến đúng vị trí, tức là scrollToPosition () không hoạt động chính xác (cuối cùng tôi đã thu gọn thanh công cụ theo lập trình).
Để StaggeredGridLayoutManager
làm điều này:
RecyclerView rv = findViewById(...);
StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(...);
rv.setLayoutManager(lm);
Và để xem các mục có thể nhìn thấy:
int[] viewsIds = lm.findFirstCompletelyVisibleItemPositions(null);
ViewHolder firstViewHolder = rvPlantios.findViewHolderForLayoutPosition(viewsIds[0]);
View itemView = viewHolder.itemView;
Nhớ kiểm tra xem nó có trống không.
Bạn có thể tìm phần con hiển thị đầu tiên và cuối cùng của chế độ xem tái chế và kiểm tra xem chế độ xem bạn đang tìm có nằm trong phạm vi không:
var visibleChild: View = rv.getChildAt(0)
val firstChild: Int = rv.getChildAdapterPosition(visibleChild)
visibleChild = rv.getChildAt(rv.childCount - 1)
val lastChild: Int = rv.getChildAdapterPosition(visibleChild)
println("first visible child is: $firstChild")
println("last visible child is: $lastChild")
Mọi câu trả lời ở trên đều đúng và tôi cũng muốn thêm ảnh chụp nhanh từ mã làm việc của mình.
recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//some code when initially scrollState changes
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//Some code while the list is scrolling
LinearLayoutManager lManager = (LinearLayoutManager) recycler.getLayoutManager();
int firstElementPosition = lManager.findFirstVisibleItemPosition();
}
});
Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.
Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?
Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.
Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.
Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?
Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.
Màn hình Samsung Galaxy S9 Plus. Chủ nhật này là Ngày của Cha — trong trường hợp nó khiến bạn suy nghĩ — và thay vì mua cho anh ấy một chiếc cà vạt trong năm nay, có lẽ đã đến lúc bạn mua cho anh ấy thứ mà anh ấy sẽ thực sự sử dụng.
Monster Hunter: World yêu thích các sự kiện chéo. Dù có nghĩa là hóa trang thành Dante của Devil May Cry, giả dạng Horizon: Zero Dawn's Aloy, hay chiến đấu với quái vật Final Fantasy, các nhiệm vụ sự kiện khác nhau của Thế giới được nâng cấp tự do so với các trò chơi khác.
Storm Reid, Oprah Winfrey, Mindy Kaling, Reese Witherspoon và Ava DuVernay tại buổi chiếu đặc biệt của A Wrinkle in Time tại Nhà hát Walter Reade ở Thành phố New York vào ngày 7 tháng 3 năm 2018 “Ava rất mong được nói chuyện với bạn,” một trong những người của Array dư luận viên nói qua điện thoại. (Array là tập thể phân phối, nghệ thuật và vận động chính sách của Ava DuVernay tập trung vào các bộ phim của người da màu và phụ nữ.
Mission Impossible: Rogue Nation bắt đầu ở một cấp độ khác. Theo nghĩa đen.
McCain, người đang làm việc cho một album mới, lần đầu tiên bước vào vòng kết nối vào tối thứ Sáu ở Nashville
Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!
Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!
Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không
Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.
Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.
Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.
Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.