最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Android開發(fā)中ListView控件性能的一些優(yōu)化方法

 更新時間:2016年01月18日 09:37:18   作者:左老怪  
這篇文章主要介紹了Android開發(fā)中ListView控件性能的一些優(yōu)化方法,需要的朋友可以參考下

ListView優(yōu)化一直是一個老生常談的問題,不管是面試還是平常的開發(fā)中,ListView永遠不會被忽略掉,那么這篇文章我們來看看如何最大化的優(yōu)化ListView的性能。

1.在adapter中的getView方法中盡量少使用邏輯

2.盡最大可能避免GC

3.滑動的時候不加載圖片

4.將ListView的scrollingCache和animateCache設(shè)置為false

5.item的布局層級越少越好

6.使用ViewHolder

下面就具體來看一些

1.在adapter中的getView方法中盡量少使用邏輯

不要在你的getView()中寫過多的邏輯代碼,我們可以將這些代碼放在別的地方,例如:

優(yōu)化前的getView():

@Override

public View getView(intposition, View convertView, ViewGroup paramViewGroup) {

Object current_event = mObjects.get(position);

ViewHolder holder =null;if(convertView ==null) {

holder =newViewHolder();

convertView = inflater.inflate(R.layout.row_event,null);

holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);

holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);

convertView.setTag(holder);

}else{

holder = (ViewHolder) convertView.getTag();

}

//在這里進行邏輯判斷,這是有問題的

if(doesSomeComplexChecking()) {

holder.ThreeDimention.setVisibility(View.VISIBLE);

}else{

holder.ThreeDimention.setVisibility(View.GONE);

}

// 這是設(shè)置image的參數(shù),每次getView方法執(zhí)行時都會執(zhí)行這段代碼,這顯然是有問題的

RelativeLayout.LayoutParams imageParams =newRelativeLayout.LayoutParams(measuredwidth, rowHeight);

holder.EventPoster.setLayoutParams(imageParams);

returnconvertView;

}

優(yōu)化后的getView():

@Override

public View  getView(intposition, View convertView, ViewGroup paramViewGroup) {

Object object = mObjects.get(position);

ViewHolder holder =null;if(convertView ==null) {

holder =newViewHolder();

convertView = inflater.inflate(R.layout.row_event,null);

holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);

holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);

//設(shè)置參數(shù)提到這里,只有第一次的時候會執(zhí)行,之后會復用

RelativeLayout.LayoutParams imageParams =newRelativeLayout.LayoutParams(measuredwidth, rowHeight);

holder.EventPoster.setLayoutParams(imageParams);

convertView.setTag(holder);

}else{

holder = (ViewHolder) convertView.getTag();

}// 我們直接通過對象的getter方法代替剛才那些邏輯判斷,那些邏輯判斷放到別的地方去執(zhí)行了holder.ThreeDimension.setVisibility(object.getVisibility());returnconvertView;

}

2.GC 垃圾回收器

當你創(chuàng)建了大量的對象的時候,GC就會頻繁的執(zhí)行,所以在getView()方法中不要創(chuàng)建很多的對象,最好的優(yōu)化是,不要在ViewHolder以外創(chuàng)建任何對象,如果你的你的log里面發(fā)現(xiàn)“GC has freed some memory”頻繁出現(xiàn)的話,那你的程序肯定有問題了。你可以檢查一下:

a) item布局的層級是否太深

b) getView()方法中是否有大量對象存在

c) ListView的布局屬性

3.加載圖片

如果你的ListView中需要顯示從網(wǎng)絡(luò)上下載的圖片的話,我們不要在ListView滑動的時候加載圖片,那樣會使ListView變得卡頓,所以我們需要再監(jiān)聽器里面監(jiān)聽ListView的狀態(tài),如果滑動的時候,停止加載圖片,如果沒有滑動,則開始加載圖片

listView.setOnScrollListener(newOnScrollListener() {

@Override

public void onScrollStateChanged(AbsListView listView,intscrollState) {

//停止加載圖片

if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {

imageLoader.stopProcessingQueue();

}else{

//開始加載圖片

imageLoader.startProcessingQueue();

}

}

@Override

public void onScroll(AbsListView view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {

// TODO Auto-generated method stub}

});

4.將ListView的scrollingCache和animateCache設(shè)置為false

scrollingCache:scrollingCache本質(zhì)上是drawing cache,你可以讓一個View將他自己的drawing保存在cache中(保存為一個bitmap),這樣下次再顯示View的時候就不用重畫了,而是從cache中取出。默認情況下drawing cahce是禁用的,因為它太耗內(nèi)存了,但是它確實比重畫來的更加平滑。而在ListView中,scrollingCache是默認開啟的,我們可以手動將它關(guān)閉。

animateCache:ListView默認開啟了animateCache,這會消耗大量的內(nèi)存,因此會頻繁調(diào)用GC,我們可以手動將它關(guān)閉掉

優(yōu)化前的ListView

<android:id="@android:id/list"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:cacheColorHint="#00000000"

android:divider="@color/list_background_color"

android:dividerHeight="0dp"

android:listSelector="#00000000"

android:smoothScrollbar="true"

android:visibility="gone"/>

優(yōu)化后的ListView

<android:id="@android:id/list"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:divider="@color/list_background_color"

android:dividerHeight="0dp"

android:listSelector="#00000000"

android:scrollingCache="false"

android:animationCache="false"

android:smoothScrollbar="true"

android:visibility="gone"/>

5.減少item的布局的深度

我們應(yīng)該盡量減少item布局深度,因為當滑動ListView的時候,這回直接導致測量與繪制,因此會浪費大量的時間,所以我們應(yīng)該將一些不必要的布局嵌套關(guān)系去掉。減少item布局深度

6.使用ViewHolder

這個大家應(yīng)該非常熟悉了,但是不要小看這個ViewHolder,它可以大大提高我們ListView的性能

ListView的優(yōu)化我們已經(jīng)講完了,如果在你的項目中,這些基本優(yōu)化你還沒有做到的話,那么你的ListView是有問題的,還有很大的提升潛力,以后再使用ListView的時候,一定要將這幾點考慮進去,發(fā)揮它的最大的性能。

附:

此外,如果發(fā)現(xiàn)性能方面的問題,以下幾個常見問題也應(yīng)注意:

1..Adapter的getView方法里面convertView沒有使用setTag和getTag方式;

2.在getView方法里面ViewHolder初始化后的賦值或者是多個控件的顯示狀態(tài)和背景的顯示沒有優(yōu)化好,抑或是里面含有復雜的計算和耗時操作;

3.在getView方法里面 inflate的row 嵌套太深(布局過于復雜)或者是布局里面有大圖片或者背景所致;

4.Adapter多余或者不合理的notifySetDataChanged;

5.listview 被多層嵌套,多次的onMessure導致卡頓,如果多層嵌套無法避免,建議把listview的高和寬設(shè)置為fill_parent. 如果是代碼繼承的listview,那么也請你別忘記為你的繼承類添加上LayoutPrams,注意高和寬都是fill_parent的;  以往我一般都是將listview的高度設(shè)置成fill_parent,而這次我是設(shè)為wrap_content,這樣做的問題在于,ListView沒有取到實際的高度,他還要根據(jù)計算才能確定,而每一次計算應(yīng)該會觸發(fā)listview的渲染,所以就會出現(xiàn)getview的調(diào)用次數(shù)跟正常情況相比多了好幾倍。所以在一般情況下,我建議把listiview在布局文件中的高度總是設(shè)置為:fill_parent(或者match_parent),這不僅僅是getview的調(diào)用次數(shù)問題,還涉及到布局的效率。

相關(guān)文章

  • Android仿微信群聊頭像

    Android仿微信群聊頭像

    這篇文章主要為大家介紹了Android仿微信群聊頭像的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android系統(tǒng)進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路

    Android系統(tǒng)進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接

    本文主要介紹Android IPC通信Binder中的Server和Client獲得Service Manager接口,這里詳細的說明了如何實現(xiàn)Service Manager接口,對研究Android源碼的朋友提供幫助,有需要的小伙伴可以參考下
    2016-08-08
  • Flutter使用AnimatedOpacity實現(xiàn)圖片漸現(xiàn)動畫

    Flutter使用AnimatedOpacity實現(xiàn)圖片漸現(xiàn)動畫

    其實在Flutter中提供了一些封裝好的動畫組件,以便我們快速應(yīng)用。本文將利用其中的AnimatedOpacity組件實現(xiàn)圖片漸現(xiàn)動畫效果,需要的可以參考一下
    2022-03-03
  • android使用gesturedetector手勢識別示例分享

    android使用gesturedetector手勢識別示例分享

    這篇文章主要介紹了android使用手勢識別的方法,介紹了單擊觸摸屏觸發(fā)的事件和雙擊事件的使用等方法,大家參考使用吧
    2014-01-01
  • Android Studio多渠道打包、自定義打包APK名稱

    Android Studio多渠道打包、自定義打包APK名稱

    Android Studio為我們提供了簡便的方法,可以多渠道打包,一次打包所有的渠道包。這篇文章主要介紹了Android Studio多渠道打包、自定義打包APK名稱,需要的朋友可以參考下
    2018-01-01
  • Android?Camera+SurfaceView自動聚焦防止變形拉伸

    Android?Camera+SurfaceView自動聚焦防止變形拉伸

    這篇文章主要為大家介紹了Android自定義相機Camera+SurfaceView實現(xiàn)自動聚焦防止變形拉伸詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Android開發(fā)自定義TextView省略號樣式的方法

    Android開發(fā)自定義TextView省略號樣式的方法

    這篇文章主要介紹了Android開發(fā)自定義TextView省略號樣式的方法,結(jié)合實例形式分析了Android文本控件TextView相關(guān)屬性與字符串操作技巧,需要的朋友可以參考下
    2017-10-10
  • JNI方法實現(xiàn)圖片壓縮(壓縮率極高)

    JNI方法實現(xiàn)圖片壓縮(壓縮率極高)

    這篇文章主要給大家介紹了一種JNI方法實現(xiàn)圖片壓縮(壓縮率極高)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Flutter路由框架Fluro使用簡介

    Flutter路由框架Fluro使用簡介

    這篇文章主要介紹了Flutter路由框架Fluro使用簡介,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • TabLayout+ViewPager2的簡單使用詳解

    TabLayout+ViewPager2的簡單使用詳解

    這篇文章主要為大家詳細介紹了TabLayout+ViewPager2的簡單使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09

最新評論

大洼县| 荣昌县| 根河市| 贺州市| 大悟县| 漳平市| 万载县| 万载县| 平安县| 雷山县| 滁州市| 龙胜| 江津市| 长海县| 丽江市| 土默特右旗| 阿拉善盟| 沅陵县| 长治市| 钦州市| 报价| 渝北区| 古浪县| 涞源县| 上杭县| 闸北区| 偃师市| 合山市| 乐陵市| 南漳县| 江西省| 亚东县| 延川县| 孟津县| 隆林| 武隆县| 灯塔市| 丹东市| 关岭| 蓬溪县| 泰兴市|