2015年3月26日 星期四

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



原文:http://ahua186186.iteye.com/blog/1830180

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-它,再用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){




更新視圖數據

}