目的:
減少ListView上下滑動更換圖片時產生的Lag
操作:
在Main.java使用setOnScrollListener()偵測ListView是否滑動,若處於靜止的狀態時,就開始更換item上的圖片
**只要ListView初始化完成後,使用者開始滑動,一切更換圖片的code皆在setOnScrollListener()中的onScrollStateChange()中進行處理**
Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| MyAdapter adapter = null ;
ListView lv = new ListView(this) ;
lv.setAdapter(adapter = new MyAdapter()) ;
lv.setOnScrollListener( new OnScrollListener() {
@Override
public void onScrollStateChanged( AbsListView listview, int scrollState ) {
// TODO Auto-generated method stub
switch ( scrollState ) {
case OnScrollListener.SCROLL_STATE_IDLE:
MyAdapter.scrolling = false ;
int first = listview.getFirstVisiblePosition() ;
int childCnt = listview.getChildCount() ; // listview可用的view總數
int listDataSize = lvAdapter.getListDataSize() ;
for ( int i = 0 ; i < childCnt ; ++i ) {
View convertView = listview.getChildAt( i ) ; // 取出目前需處理的item
// 取出ViewHolder後可以進行而外處理
MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder) convertView.getTag() ;
convertView.setTag( R.image.used, "自訂此圖的記號" ) ;
//...更新item上的圖片
}
break ;
default:
MyAdapter.scrolling = true ;
//...可以取消下載的進程
break ;
}
}
@Override
public void onScroll( AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount ) {
// TODO Auto-generated method stub
}
} ) ;
|
在MyAdapter的getView()中處理當前使用item的圖片,是否與前一張圖是否相同,若相同就不處理,若不相同則代表需要更換新圖片在此item中
**畫面上起初所看到的幾張圖片在此處理並顯示,後續上下滑動事件時所更換圖片的code由ListView的setOnScrollListener()處理**
MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| public static boolean scrolling = false ;
@Override
public View getView( int position, View convertView, ViewGroup parent ) {
// TODO Auto-generated method stub
ViewHolder holder = null ;
if ( convertView == null ) {
//...
convertView.setTag( holder ) ;
} else {
holder = (ViewHolder) convertView.getTag() ;
}
if ( !scrolling ) {
//...畫面上起初所看到的幾張圖片在此處理並顯示
// 記錄此item目前被誰所用
convertView.setTag( R.image.used, "自訂此圖的記號" ) ;
} else {
String nowTag = "自訂此圖的記號" ;
String preTag = String.valueOf( convertView.getTag( R.image.used ) ) ;
// preTag未產生過則為null,或者有手動清除過
// item目前使用的圖跟前一張圖是否相同,若相同則代表此圖未滑出螢幕範圍
if ( preTag != null && !nowTag.equals( preTag ) ) {
convertView.setTag( R.image.used, null ) ; // 清除此圖的記號
//...清除此圖,為了下次此item滑到螢幕範圍內後,不會顯示上一張圖
}
}
return convertView ;
}
|