目的:
減少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()處理**
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 ; } |
沒有留言:
張貼留言