Android開發筆記(12)——ListView & Adapter

来源:http://www.cnblogs.com/igoslly/archive/2017/06/05/6947225.html
-Advertisement-
Play Games

轉載請註明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是關於ListFragment的內容,首先先介紹ListView的相關配置,理解ListFragment也相較容易。 在fznpcy專欄:http://blog.csdn.net/fznpc ...


轉載請註明:http://www.cnblogs.com/igoslly/p/6947225.html

 

下一章是關於ListFragment的內容,首先先介紹ListView的相關配置,理解ListFragment也相較容易。

在fznpcy專欄:http://blog.csdn.net/fznpcy/article/details/8658155/ 有較為詳盡的講解和範例。

 

ListView & Adapter

一、Adapter

Adapter是連接後端數據和前端顯示的適配器介面,是數據和UI(View)之間一個重要的紐帶。

在常見的View(List View,Grid View)等地方都需要用到Adapter

如下圖直觀的表達了DataAdapterView三者的關係:

 

Adapter存在多種形式,但我們這裡只介紹常用的ArrayAdapterSimpleAdapterBaseAdapter

 

二、ArrayAdapter

每個Adapter都要自定義各自的item佈局文件,ArrayAdapter只包含文字,一般使用android.R.layout.simple_list_item_1系統定義好的佈局文件只顯示一行文字

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textColor="#fff"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

 創建ArrayAdapter

String[] strs = {"1","2","3","4","5"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.xxx,strs);

 當然也可以在Android Studio —  strings.xml中直接定義ArrayList

    <string-array name="list_item">
        <item>Practice Record</item>
        <item>Competition Record</item>
        <item>Previous History</item>
        <item>Game Rules</item>
        <item>How to use this app?</item>
        <item>User Information</item>
    </string-array>

 

AppDrawer Layout中既可以簡單使用,設定菜單列表。

 

 

三、SimpleAdapter

SimpleAdapterArrayAdapter能實現更複雜的結構,可放ImageView(圖片),Button(按鈕),CheckBox(覆選框)等等。

包含ListView可直接繼承ListActivity,和普通的Activity沒有太大的差別,不同就是對顯示ListView做了許多優化,方面顯示而已。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="8"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Null"
            android:textSize="20sp"
            android:padding="2dp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_player"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Null"
            android:textSize="16sp"
            android:padding="2dp"
            android:id="@+id/list_competition_date"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="100"
            android:gravity="center"
            android:textSize="24sp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_scoreA"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="—"
            android:gravity="center"
            android:textSize="28sp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="100"
            android:gravity="center"
            android:textSize="24sp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_scoreB"/>
    </LinearLayout>
</LinearLayout>

 

接收參數包含

this,佈局文件(alist.XML),Hash Map,佈局文件控制項Id。Hash Map的每個鍵值數據,和佈局文件中對應id的組件,一一映射。

創建列表ArrayList,每個元素即是單獨的Hash Map,根據key word關鍵字添加字元串 / 圖片名

map.put("key_word1","value1");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("title", "G1");
            map.put("info", "google 1");
            map.put("img", R.drawable.i1);
            list.add(map);

 

創建SimpleAdapter

SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
                    new String[]{"title","info","img"},
                    new int[]{R.id.title,R.id.info,R.id.img});

 實際效果圖

包含圖片的效果圖

 

四、BaseAdapter

在列表上添加Button,實時修改Adapter,都必須使用BaseAdapter

SimpleAdapter也繼承於BaseAdapter

BaseAdapter是抽象類,必須自定義一個Adapter繼承它,也可結合ViewHolder進行顯示。

 

/* 當List有大量的數據需要載入的時候,會占據大量記憶體,影響性能,這時候就需要按需填充並重新使用view來減少對象的創建

 * 最快的方式是定義一個Viewholder,將convextag設置為Viewholder,不為空時重新使用即可

 * findViewById是在解析layout.xml佈局那種其中的子View,解析xml是一個力氣活,所以提出了ViewHolder的概念

 * 使用一個靜態類,保存xml中的各個子View的引用關係,這樣就不必要每次都去解析xml了。

 */

 

繼承BaseAdapter定義時,必須重載4個函數:getCount()getItem(int position)getItemId(int position)getView(int position, View convertView, ViewGroup parent)

    public class CompetitionListAdapter extends BaseAdapter {
        private LayoutInflater mInflater=null;
        public CompetitionListAdapter(Context context){
            this.mInflater=LayoutInflater.from(context);
        }
        @Override
        public int getCount(){
            return  competitionlist.size();
        }
        @Override
        public Object getItem(int position){
            return competitionlist.get(position);
        }
        @Override
        public long getItemId(int position){
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            ViewHolder holder = null;
            if (convertView ==null){
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.history_list_competition,null);
                holder.date=(TextView)convertView.findViewById(R.id.list_competition_date);
                holder.scoreA=(TextView)convertView.findViewById(R.id.list_competition_scoreA);
                holder.scoreB=(TextView) convertView.findViewById(R.id.list_competition_scoreB);
                holder.player=(TextView)convertView.findViewById(R.id.list_competition_player);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.date.setText((String)competitionlist.get(position).get("date"));
            holder.scoreA.setText((String)competitionlist.get(position).get("scoreA"));
           holder.scoreB.setText((String)competitionlist.get(position).get("scoreB"));
            holder.player.setText((String)competitionlist.get(position).get("player"));
            return convertView;
        }
        private class ViewHolder{
            public TextView date;
            public TextView player;
            public TextView scoreB;
            public TextView scoreA;
        }
    }

當數據源有修改時,需要notifyDataSetChanged()告知。

        public void setDataList(List<Map<String,Object>> list){
            if (list!=null){
                competitionlist=list;
                notifyDataSetChanged();
            }
        }

 


本筆記內容均為個人學習整理,轉載請註明博客園-igoslly


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

-Advertisement-
Play Games
更多相關文章
  • <ul class="ddd"> <li class="solid active">啦啦啦啦</li> <li class="solid">我哦我我</li> <li class="solid">哦哦哦哦</li> <li class="solid">噢噢噢噢</li> <li class="sol ...
  • 1. 2.雙向數據綁定 3.v-if 4.v-show:也是條件渲染指令,和v-if指令不同的是,使用v-show指令的元素始終會被渲染到HTML(但是使用v-if指令的元素如果表達式為假,則不會被渲染到HTML頁面,這裡要註意v-if和v-show的這個區別),它只是簡單地為元素設置CSS的sty ...
  • 作者 | 劉博(又拍雲多媒體開發工程師) 當前為了滿足比較火熱的移動 Web 端直播需求,一系列的 HTML5 直播技術迅速的發展起來。 常見的可用於 HTML5 的直播技術有 HLS、WebSocket 與 WebRTC。今天我向大家介紹WebSocket 與 MSE 相關的技術要點,併在最後通過 ...
  • 之前一直用js的foreach,只是用來迴圈,也不知道它的定義是什麼,知道今天看到一段js, 裡邊用的方式是第一次見到,於是上網一搜。 才知道foreach原來是這樣的 array1.forEach(callbackfn[, thisArg]) 它還有一個可選的參數 具體用法這裡寫的已經很清楚了 看 ...
  • omi cli "omi cli" "omi cli命令" "omi框架" 用戶指南 "文件目錄" "npm 腳本" "npm start" "npm run dist" "代碼分割" "相容 IE8" "插入 CSS" "插入組件局部 CSS" "局部CSS使用圖片" "插入 Less" "插入組 ...
  • 前端感覺寫的比較少,也是為了練手,下午沒事用來寫了這個三級聯動,也是第一次寫這東西。 據我瞭解,城市信息可以選擇存在資料庫或者直接寫在前端,為了省事,我直接寫在前端,下麵是我的代碼: <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional/ ...
  • 關於網路安全加密的介紹可以看之前文章: "1. 網路安全——數據的加密與簽名,RSA介紹" "2. Base64編碼、MD5、SHA1 SHA512、HMAC(SHA1 SHA512)" "3. When I see you again(DES、AES、RSA、Base64、MD5加密原理介紹,代碼 ...
  • Android系統在運行每一個程式應用的時候,都會創建一個Application對象,用於存儲與整個應用相關的公共變數。一個Android應用只會生成一個Application對象,在不同的Activity中獲取的Application對象是一樣的,所以Application對象是一個單例(Sing ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...