日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ListView有多種ItemView的優(yōu)化

對于ListView 的優(yōu)化,網(wǎng)上已經(jīng)被講解過很多,ListView的優(yōu)化一般優(yōu)化如下幾點:

  (1)Item View重用優(yōu)化(防內(nèi)存溢出)

  (2)View查找優(yōu)化(減少執(zhí)行時間)

  (3)滑動優(yōu)化,在滑動的時候加載圖片數(shù)據(jù)等(防滑動卡頓)

以上基本上是對應(yīng)單ItemView進行的優(yōu)化,對于多種ItemView的優(yōu)化一般使用BaseAdapter給

提供的兩個方法

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

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

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

如果有多個的時候,就需要重寫這個方法了,并且返回的必須滿足一下要求:

(1)getItemViewType()返回值必須大于等于0,并且小于類型的個數(shù)。為什么是這個范圍,是因為

     在ListView里有一個數(shù)據(jù),用來緩存已經(jīng)使用過的Item View,詳細信息自己看源碼

(2)getViewTypeCount()這個方法的返回值就是你可能遇到的Item view類型的***個數(shù),ListView會根據(jù)這個返回值

     去創(chuàng)建緩存數(shù)組

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

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

如果換做別人呢?非常非常的痛苦.....

我在做我們的app的時候,就遇到了這樣的問題,訂單列表,每種訂單所對應(yīng)的Item View會有很大的區(qū)別,操作起來極為不方便,如有小的

改動都會耽誤很長時間。新增類型也不好處理。

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

設(shè)計:

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

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

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

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

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

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

使用方法:

 
 
  1. [mw_shl_code=java,true]private ListView mListView; 
  2.         private List mList = new ArrayList(); 
  3.         @Override 
  4.         protected void onCreate(Bundle savedInstanceState) { 
  5.                 super.onCreate(savedInstanceState); 
  6.                 setContentView(R.layout.activity_main); 
  7.                 createData(); 
  8.                 mListView = (ListView) findViewById(R.id.my_listview); 
  9.                 //不同之處在于多了一個provider集合,提供所有期望顯示類型的provider class 
  10.                 //getView的實現(xiàn)在provider中實現(xiàn),和在adapter中用法一樣 
  11.                 List> providers = new ArrayList>(); 
  12.                 providers.add(FlightOrderViewProvider.class); 
  13.                 providers.add(SticketOrderViewProvider.class); 
  14.                 
  15.                 MiltilViewListAdapter adpater = new MiltilViewListAdapter(getApplication(), mList, providers); 
  16.                 mListView.setAdapter(adpater); 
  17.         }[/mw_shl_code] 

 本文鏈接:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=329890&extra=page%3D2%26filter%3Ddateline%26orderby%3Dlastpost%26dateline%3D604800&page=1


網(wǎng)站欄目:ListView有多種ItemView的優(yōu)化
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/dpipppp.html