android 之listview 優(yōu)化方法
這個(gè)東西做android是必備的,我相信你一定也會(huì),但是我寫下來的目的就是記錄一下。
這個(gè)東西面試也很多會(huì)問到的,那么我們?cè)趺椿卮鹉牵?/p>
首先我認(rèn)為有這么幾點(diǎn):
1、listview在定義的時(shí)候?qū)捄透咦詈霉潭ㄒ幌?,這樣可以減少listview測(cè)量次數(shù),避免每次加載的時(shí)候都要去進(jìn)行測(cè)量。
2、分頁(yè)加載,這也是優(yōu)化之一,優(yōu)化內(nèi)存,還有體驗(yàn)感,有興趣的可以試試大數(shù)據(jù)加載;
3、convertView 就是布局的復(fù)用;
4、ViewHolder的使用 目的減少findviewByID的次數(shù);
下面代碼驗(yàn)證一下3和4。
public View getView(int position, View convertView, ViewGroup parent) { Log.e("========>>>>>", "getView-----position" + position); convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); return convertView; }
也就是說如果這樣寫的話每次都會(huì)進(jìn)行布局的填充(滑動(dòng)一下你就會(huì)發(fā)現(xiàn)每次都會(huì)打印日志),找到相應(yīng)的布局,如果每次都去填充的話肯定浪費(fèi)資源,所以我們這樣去寫
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); Log.e("========>>>>>", "getView-----position" + position); } else { } return convertView; }
你會(huì)看到日志始終是這幾個(gè)數(shù)據(jù)(如果你頁(yè)面顯示5個(gè)那個(gè)這里的數(shù)據(jù)就應(yīng)該是六條會(huì)比顯示的數(shù)據(jù)多一條)。
ViewHolder
如果不使用viewHolder的話代碼就是這樣的
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); } TextView textView = convertView.findViewById(R.id.tv); textView.setText(mArrayList.get(position)); return convertView; }
很明顯這段代碼每次textview 都得findViewById;你可能會(huì)說你可以在if判斷里面findViewById啊,然后在if外邊賦值啊,你可以試試 你會(huì)發(fā)現(xiàn)很有意思的事情,上下滑動(dòng)幾次,你會(huì)發(fā)現(xiàn)數(shù)據(jù)就會(huì)混亂,并且重復(fù)數(shù)據(jù)很多。這樣顯然是不符合我們的要求的;
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null); viewHolder = new ViewHolder(); viewHolder.mTextView = convertView.findViewById(R.id.tv); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.mTextView.setText(mArrayList.get(position)); return convertView; } public static class ViewHolder { private TextView mTextView; }
這樣的基本復(fù)合我們的要求了,數(shù)據(jù)不會(huì)混亂并且復(fù)用了布局還減少了findViewById的次數(shù),這樣大大減少了內(nèi)存的使用。其實(shí)這樣做有個(gè)問題listview item中如果有圖片快速滑動(dòng)你會(huì)發(fā)現(xiàn)錯(cuò)位的問題,當(dāng)然這些問題第三方的加載框架一般都可以解決。listview item盡量減少布局的嵌套 還有大圖片的加載 容易o(hù)om。listview 優(yōu)化差不多就這些,如果還有其他的更好的優(yōu)化方法,歡迎留言。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義View實(shí)現(xiàn)動(dòng)畫效果詳解
這篇文章主要為大家詳細(xì)介紹了Android如何通過自定義View實(shí)現(xiàn)動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02Android activity實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)功能
Activity是一個(gè)Android的應(yīng)用組件,它提供屏幕進(jìn)行交互。今天通過本文給大家介紹Android activity實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)功能,感興趣的朋友一起看看吧2021-06-06android實(shí)現(xiàn)圖片反轉(zhuǎn)效果
這篇文章主要介紹了android實(shí)現(xiàn)圖片反轉(zhuǎn)效果的方法,需要的朋友可以參考下2015-09-09Android開發(fā)之基于DialogFragment創(chuàng)建對(duì)話框的方法示例
這篇文章主要介紹了Android開發(fā)之基于DialogFragment創(chuàng)建對(duì)話框的方法,結(jié)合實(shí)例形式分析了DialogFragment創(chuàng)建對(duì)話框的具體功能與布局相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08Android為Tiny4412設(shè)備驅(qū)動(dòng)在proc目錄下添加一個(gè)可讀版本信息的文件
今天小編就為大家分享一篇關(guān)于Android為Tiny4412設(shè)備驅(qū)動(dòng)在proc目錄下添加一個(gè)可讀版本信息的文件,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12android實(shí)現(xiàn)簡(jiǎn)單拍照功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡(jiǎn)單拍照功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06