2013-10-11 68 views
0

我有一個問題,當它在屏幕外時,獲取列表項的視圖。如何在平滑滾動後更改列表項的背景?

首先我很平滑滾動到它

//locationsList is a listview 
locationsList.post(new Runnable() { 
    @Override 
    public void run() { 
     locationsList.smoothScrollToPosition(k); 
    } 
}); 

然後,我想做

View listItem = locationsList.getChildAt(k); 
listItem.setBackgroundColor(getResources().getColor(R.color.highlight)); 

我如何把這個它做滾動後?

+1

因此基本上你想要知道滾動何時完成? – Lefteris

+0

getview將在該位置可見時調用,因此請嘗試在getview中調用背景。 –

+0

@Lefteris是因爲getChildAt返回null如果視圖不在屏幕上 – abounket

回答

0

將一個唯一的標籤設置爲listitem視圖。無論何時想要更改滾動,都可以使用此標籤訪問此列表項。

0

如果你想知道的是,當你滾動沒有完成,你需要一個onScrollListener添加到您的列表視圖:

locationsList.setOnScrollListener(new OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
       if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){ 
        View listItem = locationsList.getChildAt(k); 
        listItem.setBackgroundColor(getResources().getColor(R.color.highlight)); 
       } 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      } 
     }); 

當然上述需要一個邏輯只更新,如果滾動面前背景所以你應該使用一個布爾標誌並在locationsList.smoothScrollToPosition(k);執行時將其設置爲true,如果該標誌爲true,則運行scrollListener中的代碼並將標誌設置爲false

+0

不知道爲什麼,但它將scrollState設置爲OnScrollListener.SCROLL_STATE_IDLE速度太快,並且該項目還沒有在屏幕上顯示 – abounket

+0

你確定它首先開始滾動,這意味着它通過你的runnable,然後調用scrollStateChanged事件? – Lefteris

+0

是的,它在我的runnable被調用後滾動了一下。 我把斷點看scrollState變化和東西了。 – abounket