10

我有以下方法問題最後可見項:RecyclerView:發現後立即視圖中創建

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

我的目標:保存關於項目的用戶觀看了分析數據。

爲了做到這一點,我調用這個方法在兩個不同的方案:

  • 每滾動一次轉身「閒置」狀態,並檢查哪些可見的項目。在那種情況下,我得到了預期的指標。

  • RecyclerView變得對用戶可見時。 現在是問題出現的時間。我期望當包含recylcerView的片段通過onResume()時,則調用findLastVisibleItemPosition()將返回可見項目。 但在此情況下返回-1。我想這與異步加載recyclerView +適配器內部項目初始化相對於片段/活動生命週期有關。

通過推遲該代碼由幾毫秒 - findLastVisibleItemPosition()返回正確的索引。但我不想推遲使用處理程序+延遲可運行的硬編碼,因爲調度延遲可運行是解決我真正想做的事情:檢測回收器視圖何時完成充氣並在屏幕上繪製所有視圖腳它裏面..

所以我的問題基本上都是:

  • 如何檢測時RecyclerView完成了所有initialzation /測量/充氣和它的孩子物品英尺屏幕的圖紙? (在任何用戶交互之前)。

  • 是否有任何可靠的良好實踐方式來確切地知道回收站視圖中的哪些項目真的顯示在屏幕上?

+0

嗨,在這篇文章後,@Tal Kanel,你有沒有得到可靠的答案?我有點類似的問題。 – hadez30

+0

@ hadez30:我的解決方案是運行代碼檢查從UI線程上的處理程序發佈的可運行的第一個可見項目(不延遲..)。這就是爲什麼它在UI隊列的末尾執行,根據我的經驗,在視圖本身已經改變了尺寸時調用onLayoutChange()的視圖,而不是當他的嵌套子視圖執行時,視圖已經附加到回收視圖 –

回答

0

使用OnChildAttachListener來檢測回收商何時附加新的固定器。使用延遲機制,以發送正確analitycs(\不是一個硬編碼delaybut是這樣的:

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

25ms的延遲更可靠,然後將其附着加時賽中的onResume任意

-1

至於回答您的第一個。問題要問這個問題,我發現最好的解決辦法是設置佈局變化監聽器上回收觀點:

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 
    } 
}); 

至於第二個問題,您可以getChildCount()& getChildAt(int)以獲取有關當前信息阿塔克hed child view to recyclerView,但這並不意味着它們在屏幕上可見(它們可以是一個小屏幕)。要檢查它們是否可見,請參閱Android: how to check if a View inside of ScrollView is visible?

+0

。所以它永遠不會使用總是預先定義高度和寬度的recyclerView –

0

配置更改如何?如果用戶改變屏幕方向,則可見項目也將改變。事實上,根據RecyclerView的狀態,加載的數據,滾動位置和當前屏幕配置,可見項目不斷變化。

您可能做的最好的事情是創建一個持續跟蹤可見項超集的類,方法是使其每次在屏幕上重繪時調用ItemDecoration接口,並讓該組件發送定期統計。您將在配置更改(保留其狀態)時將它重新附加到新的RecyclerView實例。

因此,例如,此組件可以跟蹤最小和最大可見位置。首先它們都是-1。然後在載入數據並在屏幕上顯示第一項後,將再次調用ItemDecoration,第一個可見項目位置現在爲0,最後可見項目位置現在爲N.滾動後,值將再次更改。您只會保留FirstVisibleItemPosition的最小值和LastVisibleItemPosition的最大值以獲取超集。在沒有改變的X秒後,或者如果用戶從活動導航返回,您將記錄併發送這些數字。

相關問題