2016-04-23 60 views
0

我有一個ListViewArrayAdapter < CustomListViewItem>設置爲其適配器。我想追蹤每個CustomListViewItem項目的展示次數。Android ListView項目的跟蹤印象

每當一個ListView項目進入視圖,應計爲一個印象。當它不在視圖中,然後再次出現時,展示次數會增加。當用戶滾動時,有些項目將不在視圖中,有些會進入視圖。我想跟蹤可以看到並移出視野的物品。

我的嘗試:

有一件事我想是setOnScrollListener的名單 視圖和 onScroll(AbsListView觀點,詮釋firstVisibleItem,詮釋visibleItemCount,INT totalItemCount)回調做跟蹤。

我可以使用firstVisibleItemvisibleItemCount來完成這項工作。 在文檔中說它在滾動完成時被調用。但是當滾動速度很慢時,它似乎被調用了很多次。可能在每個滾動像素之後。這使得卷軸非常滯後。

有沒有其他方法可以做到這一點?通過使用某種形式的回調,當它從視圖中移出或進入視圖時,會調用每個項目?

我在網上搜了很多,沒有看到任何與此類跟蹤相關的帖子。

+0

make static int [] count;爲您的列表視圖中的值的數量。 – sushildlh

+0

在getView()方法中增加它。 count [postion] ++ – sushildlh

+0

@SushilKumar:這是行不通的,因爲即使項目已經在視圖中,getView()也會被調用很多次。 –

回答

0

我找不到另一種方法來做到這一點。所以,我優化了我已經在做的事情。我以爲我應該分享這個,因爲它可能會幫助別人。

我用firstVisibleItemonScroll()只 回調visibleItemCount。我使用兩個變量來保存以前onScroll()回調的信息。它們是:

prevVisibleStartprevVisibleEnd

讓我們舉個例子來理解算法。 最初假定第一onScroll後()

˚FirstVisibleItem = 0visibleItemCount = 3 => lastVisibleItem = 2

這些用於設置我的先前的可見狀態。

所以,prevVisibleStart = firstVisibleItem = 3prevVisibleEnd = 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 
}