2015年10月14日 星期三

ListView滑動更換圖片

目的:

減少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 ;
}

沒有留言:

張貼留言