ListView效能優化問題總結
我們經常會遇到 ListView滑動的時候出現卡頓現象,這樣我們該如何解決呢?我們可以從以下幾個方面進行優化:
1.重用convertView,每次滑動list,view回收,當需要顯示新的item時候,可以重用回收器的view。
2.避免在getView中重複呼叫findViewById,使用靜態ViewHolder,然後儲存在View的 tag中。
3.利用好View Type,給每個型別建立不同的view有利於listview回收,型別不能太多。
4.儘量讓 ItemView 的 Layout 層次結構簡單,善用自定義View,自定義 View 可以有效的減小 Layout 的層級,而且對繪製過程可以很好的控制。
5.儘量能保證 Adapter 的 hasStableIds() 返回 true,這樣在 notifyDataSetChanged() 的時候,如果 id 不變,ListView 將不會重新繪製這個 View,達到優化的目的。
6.ListView滑動的流暢性,getView()中儘量少做一些耗時的操作,我們可以通過監聽ListView滾動事件來使listview處於不同滾動狀態做不同做不同的事情,比如處於滾動過程中載入少量資料,處於空閒狀態再載入所有資料。
例如ListView經常需要展示圖片,如果在滑動時對滑動過的每張圖片都要載入,會比較佔記憶體。推薦的優化方法是設定OnScrollListener,在滑動完成後再下載當前頁面的圖片。
listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState){ // 使用者手指滑動中 case SCROLL_STATE_TOUCH_SCROLL: // 使用者手指離開,但滑動動畫進行中 case SCROLL_STATE_FLING: break; // 滑動結束 case SCROLL_STATE_IDLE: int start = listView.getFirstVisiblePosition(); int end = listView.getLastVisiblePosition(); if(end >= listView.getCount()){ end = listView.getCount() - 1; } //展示start-end之間的圖片 break; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
onClickListener,當ListView的item中有比如button這些子view時,需要對其設定onclickListener,通常的寫法是在getView方法中一個個設定,比如holder.img.setonClickListener(new onClickListenr)...
但是這種寫法每次呼叫getView時都設定了一個新的onClick事件,效率很低。高效的寫法可以直接在ViewHolder中設定一個position,然後viewHolder implements OnClickListenr:
class ViewHolder implements OnClickListener{
int position;
TextView name;
public void setPosition(int position){
this.position = position;
}
@Override
public void onClick(View v) {
switch (v.getId()){
//XXXX
}
}
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView==null){
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.name.setOnClickListener(this);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
//設定holder
holder.name.setText(list.get(position).partname);
//設定position
holder.setPosition(position);
return convertView;
}
參考:http://niorgai.github.io/2014/12/13/ListView%E4%B8%8EBaseAdapter%E4%BC%98%E5%8C%96/
相關推薦
ListView和RecyclerView的使用和效能優化總結
1.ListView介紹 在手機中,使用列表顯示是一種常見的顯示格式,那麼ListView就是一種常見的方式。例如:今日頭條,網易新聞都是使用ListView或者是最近流行的RecyclerView進行首頁的佈局,最後一節將會對它進行介紹。 2.L
ListView效能優化問題總結
我們經常會遇到 ListView滑動的時候出現卡頓現象,這樣我們該如何解決呢?我們可以從以下幾個方面進行優化: 1.重用convertView,每次滑動list,view回收,當需要顯示新的item時候,可以重用回收器的view。 2.避免在getView中重複呼叫fin
C程式碼效能優化總結
轉自:https://blog.csdn.net/chenyq991/article/details/79047741 1、優化程式碼框架 個人覺得程式碼架構對效能的影響至關重要,就好骨架之於人,所以我把這個放在第一點。舉個簡單的例子: 優化前: void main() { whi
TOMCAT7併發效能優化總結
最近由於工作需要看了很多tomcat效能優化的資料,在此記錄總結一下,以備日後之需。 總結起來其實有三點: 一、tomcat啟動JVM引數調優 具體做法為在catalina.bat前面加上JAVA_OPTS引數設定 set JAVA_OPTS= -server #以伺服
【HBase調優】Hbase萬億級儲存效能優化總結
背景:HBase主叢集在生產環境已穩定執行有1年半時間,最大的單表region數已達7200多個,每天新增入庫量就有百億條,對HBase的認識經歷了懵懂到熟的過程。為了應對業務資料的壓力,HBase入庫也由最初的單機多執行緒升級為有容災機制的分散式入庫,為及早發現叢集中的問題,還開發了一套對HBas
SQL 效能優化 總結
SQL 效能優化 總結 (1)選擇最有效率的表名順序(只在基於規則的優化器中有效): ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)
Unity3D效能優化總結
轉自https://www.cnblogs.com/quansir/p/6370796.html 一、程式方面 01、務必刪除指令碼中為空或不需要的預設方法; 02、只在一個指令碼中使用OnGUI方法; 03、避免在OnGUI中對變數、方法進行更新、賦值,輸出變數建
MySQL效能優化總結___本文乃《MySQL效能調優與架構設計》讀書筆記!
一、MySQL的主要適用場景 1、Web網站系統 2、日誌記錄系統 3、資料倉庫系統 4、嵌入式系統 二、MySQL架構圖: 三、MySQL儲存引擎概述 1)MyISAM儲存引擎 MyISAM儲存引擎的表在資料庫中,每一個表
35 個 Java 程式碼效能優化總結(一)
前言 程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。程式碼優化也是一樣,如果專案著眼於儘快無BUG
35 個 Java 程式碼效能優化總結
前言 程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。程式碼優化也是
Hbase效能優化總結
本文主要是從HBase應用程式設計與開發的角度,總結幾種常用的效能優化方法。 Auto Flash 通過呼叫HTable.setAutoFlushTo(false)方法可以將HTable寫客戶端自動flush關閉,這樣可以批量寫入資料到HBase,而不是有一條put就執行
35個java程式碼效能優化總結
前言 程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮 的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。程式碼優化也是一樣,如
44個Java程式碼效能優化總結
程式碼優化的最重要的作用應該是:避免未知的錯誤。在程式碼上線執行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最後往往是一個非常小的原因。然而為了解決這個錯誤,我們需要先自驗證、再打包出待替換的class檔案、暫停業務並重啟,對
MySQL效能優化總結
一、MySQL的主要適用場景 1、Web網站系統 2、日誌記錄系統 3、資料倉庫系統 4、嵌入式系統 二、MySQL架構圖: 三、MySQL儲存引擎概述 1)MyISAM儲存引擎 MyISAM儲存引擎的表在資料庫中,每一個表都被存放為三個以表名命名
Java 程式碼效能優化總結
程式碼優化的目標是: 1、減小程式碼的體積 2、提高程式碼執行的效率 程式碼優化細節 1、儘量指定類、方法的final修飾符 帶 有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String,整個類
35 個 Java 程式碼效能優化總結(複製於碼農網)
前言 程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。程式碼優化也是一樣,如果專案著眼於儘快無BUG
React效能優化總結
from:http://www.tuicool.com/articles/VNFZBbj 初學者對React可能滿懷期待,覺得React可能完爆其它一切框架,甚至不切實際地認為React可能連原生的渲染都能完爆——對框架的狂熱確實會出現這樣的不切實際的期待。讓我們來看看Re
listview效能優化(2)
工作原理: 1.ListView針對List中每個item,要求Adapter給其一個檢視(getView) 2.一個新的檢視被返回並顯示 如果我們有上億個item要顯示怎麼辦?為每個專案建立一個新檢視?NO!這不可能~~~Android實際上提供了快取檢視
ElasticSearch學習總結(七):效能優化總結
本文主要總結Elasticsearch效能優化方面的相關內容 1. 概述 效能優化是個涉及面非常廣的問題,不同的環境,不同的業務場景可能會存在不同的優化方案,本文只對一些相關的知識點做簡單的總結,具體方案可以根據場景自行嘗試。 1.1 效能測試 如果需要做效能調優,效能基準測
Android ListView效能優化,非同步載入圖片
<span style="font-size:14px;"><span style="font-size:14px;">public static void initImageLoader(Context context) { personOptions = new D