5

是否有可能在每個listview的項目上都有一個可見性監聽器?喜歡:用戶看到該項目,做一些事情。在項目被隱藏,做別的事情。ListView(Adapter)item visibility listener

我想檢查一個項目「進入」或「退出」的滾動,以便更新第二個列表。

Additionaly我的ListView可能擴大,如:

adapter.addAll( (Collection<? extends DBObject>) events); 
adapter.notifyDataSetChanged(); 

我想辦法可能是使用全局監聽器檢查項目,但恐怕它會被搞砸如果我添加更多的項目到ListView (以上)。我還沒有完成任何事情

eventList.setOnScrollListener(new OnScrollListener() { 

     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

     } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) {} 
}); 

回答

6

您可以使用onScroll函數來計算該值。

eventList.setOnScrollListener(new OnScrollListener() { 
    int oldFirstVisibleItem = 0; 
    int oldLastVisibleItem = 0; 

    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     if (firstVisibleItem > oldFirstVisibleItem) { 
      for(int i = oldFirstVisibleItem; i < firstVisibleItem; i++) { 
       onExit(i); 
      } 
     } 
     if (firstVisibleItem < oldFirstVisibleItem) { 
      for(int i = firstVisibleItem; i < oldFirstVisibleItem; i++) { 
       onEnter(i); 
      } 
     } 

     int lastVisibleItem = firstVisibleItem + visibleItemCount - 1; 
     if (lastVisibleItem < oldLastVisibleItem) { 
      for(int i = oldLastVisibleItem+1; i <= lastVisibleItem; i++) { 
       onExit(i); 
      } 
     } 
     if (lastVisibleItem > oldLastVisibleItem) { 
      for(int i = oldLastVisibleItem+1; i <= lastVisibleItem; i++) { 
       onEnter(i); 
      } 
     } 

     oldFirstVisibleItem = firstVisibleItem; 
     oldLastVisibleItem = lastVisibleItem; 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) {} 
}); 

public void onEnter(int position) { 
    // Handle an item coming into view. 
} 

public void onExit(int position) { 
    // Handle an item going out of view. 
} 
2

答案是在你的問題。

一個您在onScrollListener(覆蓋方法)是

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

     } 

傳遞的參數包括:firstVisibleItemvisibleItemCount。您可以使用這兩個數字來確定哪些項目當前可見。

請記住,滾動時經常調用onScroll。