我找不到另一種方法來做到這一點。所以,我優化了我已經在做的事情。我以爲我應該分享這個,因爲它可能會幫助別人。
我用firstVisibleItem和onScroll()只 回調visibleItemCount。我使用兩個變量來保存以前onScroll()回調的信息。它們是:
prevVisibleStart和prevVisibleEnd
讓我們舉個例子來理解算法。 最初假定第一onScroll後()
˚FirstVisibleItem = 0 和 visibleItemCount = 3 => lastVisibleItem = 2
這些用於設置我的先前的可見狀態。
所以,prevVisibleStart = firstVisibleItem = 3 和prevVisibleEnd = firstVisibleItem + visibleItemCount - 1 = 2
,如果我現在向下滾動,我將始終具有
firstVisibleItem> = prevVisibleStart and lastVisibleItem> = prevV isibleEnd
所以,如果前一個範圍是0到2.新的範圍會有點像1到3.因爲,我已經考慮到0到2的印象。我只會將3視爲新的印象。原因在於觀點1,2仍在觀察之中,並且他們並沒有離開觀點。所以,新的印象不計入這些。這有效地爲展示提供了正確的範圍,並減少了檢查的範圍。
同樣,這可以完成滾動。 假設當前可見項目是2-4。 現在滾動後範圍變成(比如說)1-3。這意味着1已經出現。所以,請爲這個觀點留下印象。這樣onScroll()中的操作數就大大減少了。
示例代碼如下
範圍[i-j)被認爲是印象。
private static int prevVisibleStart=-1;
private static int prevVisibleEnd=-1;
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(prevVisibleStart <= firstVisibleItem) {
// scroll down
i = Math.max(firstVisibleItem, prevVisibleEnd + 1);
j = firstVisibleItem + visibleItemCount;
} else {
// scroll up
i = firstVisibleItem;
j = Math.min(prevVisibleStart, firstVisibleItem + visibleItemCount);
}
prevVisibleStart = firstVisibleItem;
prevVisibleEnd = firstVisibleItem + visibleItemCount - 1;
// now can use [i-j) to update impressions
}
make static int [] count;爲您的列表視圖中的值的數量。 – sushildlh
在getView()方法中增加它。 count [postion] ++ – sushildlh
@SushilKumar:這是行不通的,因爲即使項目已經在視圖中,getView()也會被調用很多次。 –