這篇文章主要介紹“ListView中Item View的優(yōu)化方法有哪些”,在日常操作中,相信很多人在ListView中Item View的優(yōu)化方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”ListView中Item View的優(yōu)化方法有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、托管服務(wù)器解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球近1000家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。
對(duì)于ListView 的優(yōu)化,網(wǎng)上已經(jīng)被講解過很多,ListView的優(yōu)化一般優(yōu)化如下幾點(diǎn):
(1)Item View重用優(yōu)化(防內(nèi)存溢出)
(2)View查找優(yōu)化(減少執(zhí)行時(shí)間)
(3)滑動(dòng)優(yōu)化,在滑動(dòng)的時(shí)候加載圖片數(shù)據(jù)等(防滑動(dòng)卡頓)
以上基本上是對(duì)應(yīng)單ItemView進(jìn)行的優(yōu)化,對(duì)于多種ItemView的優(yōu)化一般使用BaseAdapter給
提供的兩個(gè)方法
getItemViewType():返回View類型,默認(rèn)返回0
getViewTypeCount(): 返回有多少種類型的itemView,默認(rèn)返回1
只有一種類型item view的話,是不需要重寫這兩個(gè)方法的。
如果有多個(gè)的時(shí)候,就需要重寫這個(gè)方法了,并且返回的必須滿足一下要求:
(1)getItemViewType()返回值必須大于等于0,并且小于類型的個(gè)數(shù)。為什么是這個(gè)范圍,是因?yàn)?/p>
在ListView里有一個(gè)數(shù)據(jù),用來緩存已經(jīng)使用過的Item View,詳細(xì)信息自己看源碼
(2)getViewTypeCount()這個(gè)方法的返回值就是你可能遇到的Item view類型的***個(gè)數(shù),ListView會(huì)根據(jù)這個(gè)返回值
去創(chuàng)建緩存數(shù)組
如果有兩種View類型的話,直接在Adapter里面重寫getView()方法就可以了,根據(jù)getItemViewType()返回值創(chuàng)建相應(yīng)的View既可。
但是,如果有六個(gè),七個(gè)怎么辦?那么Adapter的getView()方法得寫多少代碼,到時(shí)候維護(hù)起來會(huì)多么麻煩,自己看自己寫的還好,
如果換做別人呢?非常非常的痛苦.....
我在做我們的app的時(shí)候,就遇到了這樣的問題,訂單列表,每種訂單所對(duì)應(yīng)的Item View會(huì)有很大的區(qū)別,操作起來極為不方便,如有小的
改動(dòng)都會(huì)耽誤很長(zhǎng)時(shí)間。新增類型也不好處理。
我針對(duì)遇到的問題進(jìn)行了一個(gè)點(diǎn)點(diǎn)的優(yōu)化,可以能不是***秀的,但是至少能解決以上問題,如果您能有更好的方式,也歡迎交流。
設(shè)計(jì):
使用提供者的設(shè)計(jì)方式提供每種Item View,不同的ItemView會(huì)有不同的提供者,提供者需要實(shí)現(xiàn)一個(gè)接口:
public interface IViewProvider { public abstract View getItemView(View convertView, LayoutInflater inflater, Object data); }
提供者只需要實(shí)現(xiàn)此接口,然后實(shí)現(xiàn)getItemView()方法,實(shí)現(xiàn)方式和Adapter的getView()的方式完全一樣,減少了學(xué)習(xí)成本。
我還繼承BaseAdapter專門實(shí)現(xiàn)了一個(gè)Adapter,名字叫MiltilViewListAdapter.java,實(shí)現(xiàn)了前面說的兩個(gè)方法,和getView()方法
提供者只需要配置給MiltilViewListAdapter的實(shí)例即可。
一般情況下,都要傳遞給Adapter一個(gè)Bean集合,我的設(shè)計(jì)是,讓這里面的bean都實(shí)現(xiàn)一個(gè)接口,用來標(biāo)示它對(duì)應(yīng)的哪個(gè)提供者。
使用方法:
[mw_shl_code=java,true]private ListView mListView; private ListmList = new ArrayList (); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); createData(); mListView = (ListView) findViewById(R.id.my_listview); //不同之處在于多了一個(gè)provider集合,提供所有期望顯示類型的provider class //getView的實(shí)現(xiàn)在provider中實(shí)現(xiàn),和在adapter中用法一樣 List > providers = new ArrayList >(); providers.add(FlightOrderViewProvider.class); providers.add(SticketOrderViewProvider.class); MiltilViewListAdapter adpater = new MiltilViewListAdapter(getApplication(), mList, providers); mListView.setAdapter(adpater); }[/mw_shl_code]
到此,關(guān)于“ListView中Item View的優(yōu)化方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!