Android開發中常用的ListView列表的優化方式ViewHolder

来源:http://www.cnblogs.com/hejiaoshou/archive/2017/09/03/7471309.html
-Advertisement-
Play Games

在Android開發中難免會遇到大量的數據載入到ListView中進行顯示, 然後其中最重要的數據傳遞橋梁Adapter適配器是常用的,隨著市場的需 求變化ListView'條目中的內容是越來越多這就需要程式員來自定義適配器, 而關鍵的就是適配器的優化問題,適配器沒有優化好往往就會造成OOM (記憶體 ...


  在Android開發中難免會遇到大量的數據載入到ListView中進行顯示,

然後其中最重要的數據傳遞橋梁Adapter適配器是常用的,隨著市場的需

求變化ListView'條目中的內容是越來越多這就需要程式員來自定義適配器,

而關鍵的就是適配器的優化問題,適配器沒有優化好往往就會造成OOM

(記憶體溢出)或者是滑動卡頓之類的問題,接下來我就給大家介紹一種常

用的Adapter優化方法

  1   /**
  2      * list View的適配器
  3      */
  4     class Adapter extends BaseAdapter {
  5 
  6         /**
  7          * 返回item條目總數
  8          *
  9          * @return
 10          */
 11         @Override
 12         public int getCount() {
 13             return newsInfos.size();
 14         }
 15 
 16         /**
 17          * 次方法返回的是Object類型的,可以返回任意類型的數據
 18          * 我這裡返回的是一個java ben集合中的一個ben對象
 19          *
 20          * @param position
 21          * @return
 22          */
 23         @Override
 24         public Object getItem(int position) {
 25             return newsInfos.get(position);
 26         }
 27 
 28         /**
 29          * 返回item所在的位置,從0開始計數的
 30          *
 31          * @param position
 32          * @return
 33          */
 34         @Override
 35         public long getItemId(int position) {
 36             return position;
 37         }
 38 
 39         /**
 40          * 定義一個ViewHolder對象
 41          */
 42         ViewHolder holder;
 43 
 44         /**
 45          * 此方法返回一個item的View
 46          *
 47          * @param position    listView中item的位置
 48          * @param convertView 這個convertView其實就是最關鍵的部分  原理上講 當ListView滑動的過程中 會有item被滑出屏幕 而不再被使用 這時候Android會回收這個條目的view 這個view也就是這裡的convertView
 49          *                    當item1被移除屏幕的時候 我們會重新new一個View給新顯示的item_new 而如果使用了這個convertView 我們其實可以復用它 這樣就省去了new View的大量開銷
 50          * @param parent      parent是item的view的父視圖,調整item寬高用的 不常用
 51          * @return
 52          */
 53         @Override
 54         public View getView(int position, View convertView, ViewGroup parent) {
 55 
 56             if (convertView == null) {
 57                 convertView = View.inflate(HomeActivity.this, R.layout.list_item, null);
 58             }
 59             
 60             //先都與優化沒多大關係了都是設置每個控制項的數據
 61             holder = getHolder(convertView);
 62             holder.com.setText(newsInfos.get(position).getComment() + "次瀏覽");
 63             holder.type.setText(getType(newsInfos.get(position).getType()));
 64             holder.time.setText(newsInfos.get(position).getTime());
 65             holder.desc.setText(newsInfos.get(position).getDescription());
 66             holder.title.setText(newsInfos.get(position).getTitle());
 67             String timeId = newsInfos.get(position).getId();
 68             String stats = SharePrefenceUtils
 69                     .getInstance(HomeActivity.this).getStr("new_item" + timeId, "");
 70             if (TextUtils.equals(timeId, stats)) {
 71                 holder.stats.setText("已讀");
 72                 holder.stats.setSelected(true);
 73             } else {
 74                 holder.stats.setText("未讀");
 75                 holder.stats.setSelected(false);
 76             }
 77             holder.icon.setImageUrl(newsInfos.get(position).getImage(), null);
 78             return convertView;
 79         }
 80 
 81         /**
 82          * 得到ViewHolder
 83          *
 84          * @param view
 85          * @return
 86          */
 87         public ViewHolder getHolder(View view) {
 88             //通過傳遞進來的view 的getTag方法獲得holder
 89             ViewHolder holder = (ViewHolder) view.getTag();
 90             if (holder == null) {
 91                 //如果傳遞進來的View沒有設置Tag,就重新new一個holder實例
 92                 holder = new ViewHolder(view);
 93                 //給傳遞進來的view設置tag
 94                 view.setTag(holder);
 95             }
 96             //返回holder
 97             return holder;
 98         }
 99 
100         /**
101          * 定義一個ViewHolder類
102          */
103         class ViewHolder {
104             //下麵定義的屬性控制項都是listView中item里有的控制項
105             TextView title;
106             TextView desc;
107             TextView time;
108             TextView type;
109             TextView com;
110             TextView stats;
111             SmartImageView icon;
112 
113             /**
114              * 創建該類的實例時需要傳入item的view
115              * 來得到item中各個控制項的實例
116              *
117              * @param view
118              */
119             public ViewHolder(View view) {
120                 title = (TextView) view.findViewById(R.id.tv_title);
121                 icon = (SmartImageView) view.findViewById(R.id.iv_icon);
122                 desc = (TextView) view.findViewById(R.id.tv_desc);
123                 time = (TextView) view.findViewById(R.id.tv_time);
124                 type = (TextView) view.findViewById(R.id.tv_type);
125                 com = (TextView) view.findViewById(R.id.tv_com);
126                 stats = (TextView) view.findViewById(R.id.tv_stats);
127             }
128         }
129     }

最後給大家瞧瞧我實現的效果圖把,如果有對item樣式感興趣的朋友們請在下方留言我會再寫一篇關於android中自定義樣式的文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spark Struntured Streaming是Spark 2.1.0版本後新增加的流計算引擎,本博將通過幾篇博文詳細介紹這個框架。這篇是介紹Spark Structured Streaming的基本開發方法。以Spark 自帶的example進行測試和介紹,其為"StructuredNetw ...
  • 表的操作: 1.表的創建: create table if not exists table_name(欄位定義); 例子: create table if not exists user(id int auto_increment, uname varchar(20), address varch ...
  • 一、對資料庫的操作 1、創建一個庫 create database 庫名; 創建帶有編碼的:create database 庫名 character set 編碼; 查看編碼:show create database 庫名; 2、刪除一個庫 drop database 庫名; 3、使用庫 use 庫 ...
  • 避免ANR異常 不要在主線程中執行耗時的代碼,不然很容易出現anr錯誤。 原因: 解決方法: ...
  • android中進程的優先順序 ...
  • 內容觀察者實現簡訊監聽 通過內容觀察者監聽簡訊是否發生變化,如果發生變化,就用內容提供者讀取簡訊的內容。 原理: 當簡訊發生變化(比如說來簡訊),簡訊應用就會通知內容觀察者我的簡訊發生了變化,並把變化位置簡訊的uri傳過來,有uri之後,內容提供者就可以很方便的讀取簡訊內容了,不過肯定要保證許可權夠。 ...
  • 虛擬簡訊 ...
  • 內容提供者 參考: Android四大組件之內容提供者--ContentProvider - java小兵 - CSDN博客http://blog.csdn.net/wodewutai17quiet/article/details/46670597 Android四大組件之內容提供者--Conten ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...