1. 程式人生 > >ListView效能優化問題總結

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