ListView中getChildAt(index)的使用注意事項

yangxi_001發表於2017-07-31
1.原理 
在很多時候ListView列表資料不需要全部重新整理,只需重新整理有資料變化的那一條,這時可以用getChildAt(index)獲取某個指定position的view,並對該view進行重新整理。 

注意:在ListView中,使用getChildAt(index)的取值,只能是當前可見區域(列表可滾動)的子項! 

即取值範圍在 >= ListView.getFirstVisiblePosition() &&  <= ListView.getLastVisiblePosition(); 
1)所以如果想獲取前部的將會出現返回Null值空指標問題; 
2)getChildCount跟getCount獲取的值將會不一樣(數量多時); 
3 )如果使用了getChildAt(index).findViewById(...)設定值的話,滾動列表時值就會改變了。 
   需要使用getFirstVisiblePosition()獲得第一個可見的位置,再用當前的position-getFirstVisiblePosition(),再用getChildAt取值!即getChildAt(position - ListView.getFirstVisiblePosition()).findViewById(...)去設定值 
2.如果想更新某一行資料,需要配合ListView的滾動狀態使用,一般不滾動時才載入更新資料 

//全域性變數,用來記錄ScrollView的滾動狀態,1表示開始滾動,2表示正在滾動,0表示停止滾動  
虛擬碼 
ListView設定 
public int scrollStates; 
class OnScrollListenerImpl implements OnScrollListener{ 
@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
scrollStates = scrollState;  


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

listView.setOnScrollListener(new OnScrollListenerImpl()); 

Activity中 
if(scrollStates==OnScrollListener.SCROLL_STATE_IDLE){ 
更新檢視資料 

相關文章