10

Tôi đang gặp một vấn đề với các phương pháp sau đây:RecyclerView: tìm mục có thể nhìn thấy cuối cùng ngay sau khi xem tạo

int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition(); 
int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition(); 

Thân Mục Tiêu: tiết kiệm dữ liệu phân tích về những gì mục người dùng đã xem.

Để làm được điều đó, tôi gọi phương pháp này trong hai kịch bản khác nhau:

  • mỗi lần di chuyển quay sang "nhàn rỗi" nhà nước, và kiểm tra các mặt hàng có thể nhìn thấy là gì. trong trường hợp đó tôi nhận được các chỉ mục dự kiến.

  • khi số RecyclerView trở thành "hiển thị" cho người dùng. bây giờ là khi sự cố bắt đầu. Tôi hy vọng rằng khi mảnh chứa recylcerView được chuyển qua onResume() thì gọi findLastVisibleItemPosition() sẽ trả về các mục hiển thị. nhưng lại trả về -1, trong trường hợp đó. Tôi đoán nó có cái gì đó để làm với tải không đồng bộ của recyclerView + adapter khởi tạo mục nội bộ liên quan đến vòng đời mảnh/hoạt động.

bằng cách trì hoãn mã này sau vài mili giây - findLastVisibleItemPosition() trả về đúng chỉ mục. nhưng tôi không muốn trì hoãn mã hóa cứng bằng cách sử dụng trình xử lý + runnable bị trì hoãn, vì lập lịch biểu runnable chậm là một công việc xung quanh những gì tôi thực sự muốn thực hiện: phát hiện khi chế độ xem của trình thu thập kết thúc tăng và vẽ lên màn hình tất cả các chế độ xem có thể chân bên trong của nó ..

nên câu hỏi của tôi về cơ bản:

  • làm thế nào tôi có thể phát hiện khi RecyclerView hoàn thành tất cả các initialzation/đo/lạm phát và bản vẽ của nó con vật phẩm chân vào màn hình? (trước khi bất kỳ tương tác người dùng nào ..).

  • có cách nào thực hành tốt đáng tin cậy để biết chính xác mục nào trong 'chế độ xem tái chế thực sự được hiển thị trên màn hình không?

+0

Xin chào, bạn có nhận được bất kỳ câu trả lời đáng tin cậy nào sau bài đăng này không, @Tal Kanel? Tôi đang đối mặt với những vấn đề tương tự. – hadez30

+0

@ hadez30: giải pháp của tôi là chạy kiểm tra mã cho mục hiển thị đầu tiên từ một runnable được đăng bởi một trình xử lý trên chuỗi giao diện người dùng (không bị trì hoãn ..). Đó là lý do tại sao nó được thực hiện vào cuối hàng đợi UI mà từ kinh nghiệm của tôi xảy ra sau khi các khung nhìn đã được gắn vào khung nhìn tái chế –

Trả lời

0

Sử dụng OnChildAttachListener để phát hiện khi người tái chế đính kèm một người giữ mới. Sử dụng một cơ chế chậm trễ để gửi analitycs đúng (\ không phải là một hardcoded delaybut một cái gì đó như thế này:.

... 
public void run(){ 
    removeCallbacks() 
    postDelay(sendAnalytics(correctInformation),25); 
} 

Các 25ms trì hoãn đáng tin cậy hơn sau đó gắn nó ot onResume tùy ý

-1

Như để trả lời đầu tiên của bạn . câu hỏi đặt ra giải pháp tốt nhất cho vấn đề này mà tôi tìm thấy là để thiết lập bố trí thay đổi người nghe về một cái nhìn tái chế:.

recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     recyclerView.removeOnLayoutChangeListener(this); //remove layout change listener, you want need it anymore 
     //do your work here 
    } 
}); 

đối với câu hỏi thứ hai Bạn có thể getChildCount() & getChildAt (int) để có được thông tin về hiện attac hed xem con để recyclerView, nhưng nó không có nghĩa là chúng có thể nhìn thấy trên màn hình (chúng có thể là một màn hình nhỏ). Để kiểm tra xem chúng có hiển thị hay không, hãy xem Android: how to check if a View inside of ScrollView is visible?

+0

onLayoutChange() được gọi khi chính khung nhìn đã thay đổi nó, không phải khi các con lồng nhau của nó đã làm. do đó, nó sẽ không bao giờ hoạt động với recyclerView luôn có chiều cao và chiều rộng được xác định trước –

0

Điều gì về thay đổi cấu hình? Nếu người dùng thay đổi hướng màn hình, các mục hiển thị cũng sẽ thay đổi.Thực tế là, các mục hiển thị đang thay đổi liên tục theo trạng thái của RecyclerView, dữ liệu đã tải, vị trí cuộn và cấu hình màn hình hiện tại.

Điều tốt nhất bạn có thể làm là tạo một lớp liên tục theo dõi phần siêu mặt của các mục hiển thị, bằng cách làm cho nó triển khai giao diện ItemDecoration được gọi mỗi lần RecyclerView được vẽ lại trên màn hình và gửi thành phần này số liệu thống kê định kỳ. Bạn sẽ gắn lại nó vào ví dụ RecyclerView mới về thay đổi cấu hình (bảo toàn trạng thái của nó).

Vì vậy, ví dụ thành phần này có thể theo dõi các vị trí hiển thị tối thiểu và tối đa. Lúc đầu nó sẽ là -1 cho cả hai. Sau khi dữ liệu được tải và các mục đầu tiên được hiển thị trên màn hình, ItemDecoration sẽ được gọi lại và vị trí mục hiển thị đầu tiên sẽ là 0 và vị trí mục hiển thị cuối cùng sẽ là N. Sau khi cuộn, giá trị sẽ thay đổi một lần nữa. Bạn sẽ chỉ giữ giá trị nhỏ nhất của FirstVisibleItemPosition và giá trị tối đa của LastVisibleItemPosition để có được superset. Sau X giây mà không có thay đổi hoặc nếu người dùng điều hướng trở lại từ Hoạt động, bạn sẽ ghi và gửi những số này.

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