• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

     對于ListView 的優化,網上已經被講解過很多,ListView的優化一般優化如下幾點:
      (1)Item View重用優化(防內存溢出)
      (2)View查找優化(減少執行時間)
      (3)滑動優化,在滑動的時候加載圖片數據等(防滑動卡頓)
    以上基本上是對應單ItemView進行的優化,對于多種ItemView的優化一般使用BaseAdapter給
    提供的兩個方法

    getItemViewType():返回View類型,默認返回0

    getViewTypeCount(): 返回有多少種類型的itemView,默認返回1

    只有一種類型item view的話,是不需要重寫這兩個方法的。

    如果有多個的時候,就需要重寫這個方法了,并且返回的必須滿足一下要求:
    (1)getItemViewType()返回值必須大于等于0,并且小于類型的個數。為什么是這個范圍,是因為
         在ListView里有一個數據,用來緩存已經使用過的Item View,詳細信息自己看源碼
    (2)getViewTypeCount()這個方法的返回值就是你可能遇到的Item view類型的最大個數,ListView會根據這個返回值
         去創建緩存數組

    如果有兩種View類型的話,直接在Adapter里面重寫getView()方法就可以了,根據getItemViewType()返回值創建相應的View既可。


    但是,如果有六個,七個怎么辦?那么Adapter的getView()方法得寫多少代碼,到時候維護起來會多么麻煩,自己看自己寫的還好,
    如果換做別人呢?非常非常的痛苦.....

    我在做我們的app的時候,就遇到了這樣的問題,訂單列表,每種訂單所對應的Item View會有很大的區別,操作起來極為不方便,如有小的
    改動都會耽誤很長時間。新增類型也不好處理。

    我針對遇到的問題進行了一個點點的優化,可以能不是最優秀的,但是至少能解決以上問題,如果您能有更好的方式,也歡迎交流。

    設計:

    使用提供者的設計方式提供每種Item View,不同的ItemView會有不同的提供者,提供者需要實現一個接口:
     

    public interface IViewProvider {
        public abstract View getItemView(View convertView, LayoutInflater inflater, Object data);
    }

     

    提供者只需要實現此接口,然后實現getItemView()方法,實現方式和Adapter的getView()的方式完全一樣,減少了學習成本。

     

    我還繼承BaseAdapter專門實現了一個Adapter,名字叫MiltilViewListAdapter.java,實現了前面說的兩個方法,和getView()方法

     

    提供者只需要配置給MiltilViewListAdapter的實例即可。

     

    一般情況下,都要傳遞給Adapter一個Bean集合,我的設計是,讓這里面的bean都實現一個接口,用來標示它對應的哪個提供者。

     

    使用方法:

     

    [mw_shl_code=java,true]private ListView mListView;
            private List<IItemBean> mList = new ArrayList<IItemBean>();
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    createData();
                    mListView = (ListView) findViewById(R.id.my_listview);
                    //不同之處在于多了一個provider集合,提供所有期望顯示類型的provider class
                    //getView的實現在provider中實現,和在adapter中用法一樣
                    List<Class<? extends IViewProvider>> providers = new ArrayList<Class<? extends IViewProvider>>();
                    providers.add(FlightOrderViewProvider.class);
                    providers.add(SticketOrderViewProvider.class);
                    
                    MiltilViewListAdapter adpater = new MiltilViewListAdapter(getApplication(), mList, providers);
                    mListView.setAdapter(adpater);
            }[/mw_shl_code]

    穩定

    產品高可用性高并發

    貼心

    項目群及時溝通

    專業

    產品經理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質開發
    • 返回頂部
    国产精品青草久久| 久久久久亚洲精品无码网址色欲| 2022免费国产精品福利在线| 国产一精品一aⅴ一免费| 国产精品视频一区| 国产三级精品三级在专区中文| 亚洲成人精品久久| 国产精品天干天干综合网| 热久久这里是精品6免费观看 | 国产亚洲精品xxx| 香蕉伊思人在线精品| www.99精品| 精品一区二区三区影院在线午夜| 亚洲国产日韩在线视频| 国产成人一区二区动漫精品 | 国产午夜精品无码| 少妇人妻偷人精品一区二区 | 亚洲熟女精品中文字幕| 国产精品久久久久…| 91麻豆精品国产91久久久久久| 日韩精品专区AV无码| 无码日韩精品一区二区免费暖暖 | 丰满人妻熟妇乱又伦精品软件| 日韩午夜视频在线观看| 亚洲日韩精品A∨片无码加勒比| 国产av一区二区三区日韩| 亚洲日韩精品一区二区三区无码 | 成人区人妻精品一区二区不卡| 亚洲精品又粗又大又爽A片| 一区国产传媒国产精品| 国产精品一久久香蕉产线看| 国产chinesehd精品酒店| 97精品国产一区二区三区 | 亚洲精品人成无码中文毛片| 亚洲精品成人在线| 精品人妻V?出轨中文字幕| 久久亚洲中文字幕精品一区四| 思99热精品久久只有精品| 精品久久一区二区三区| 久久午夜精品视频| 久久99精品久久久久久动态图|