13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter適配器使用

来源:https://www.cnblogs.com/lifexy/archive/2020/02/04/12261805.html
-Advertisement-
Play Games

1.ListView ListView 是 Android 系統為我們提供的一種列表顯示的一種控制項,使用它可以用來顯示我們常見的列表形式。繼承自抽象類 AdapterView。繼承圖如下所示: 以微信好友列表為例: 裡面的每個好友就是由一個個 item 組成的,而每個item都存在Adapter適配 ...


1.ListView

ListView 是 Android 系統為我們提供的一種列表顯示的一種控制項,使用它可以用來顯示我們常見的列表形式。繼承自抽象類 AdapterView。繼承圖如下所示:

 

 

以微信好友列表為例:

 

裡面的每個好友就是由一個個 item 組成的,而每個item都存在Adapter適配器類中(負責數據處理),然後通過ListView顯示出來.

 

2.ListView顯示原理

ListView顯示數據原理實際就是MVC設計模式,如下圖所示:

 

  • Model(模型) – 數據集合,用來存儲數據組織
  • View(視圖) – ListView,負責數據顯示
  • Controller(控制器) - 負責管理Model,並設置要顯示的哪個具體數據.

 

3.使用BaseAdapter適配器

BaseAdapter比較簡單,主要是通過繼承此類來實現BaseAdapter的四個方法:

public int getCount();
//設置適配器中數據集的數據個數(ListView要顯示的所有數據行);

public Object getItem(int position):
//獲取數據集中與索引對應的數據項;

public long getItemId(int position);
//獲取指定行對應的ID,一般都是直接返回position

public View getView(int position,View convertView,ViewGroup parent);
//獲取每一行Item的顯示內容。
// position:表示當前獲取的Item是哪一行,開頭從0開始
// convertView:舊視圖復用,如果convertView不為空則表示可以用來複用.無需再次new一個view來使用.
// ViewGroup:只有LinearLayout或者RelativeLayout,如果viewGroup傳入一個具體的對象,那麼這個方法創建出來的view對象將作為這個viewGroup的childView來顯示.

示例效果如下所示:

 

3.1寫activity_main.xml

只是添加了一個ListView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/lv_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >
    </ListView>

</RelativeLayout>

 

4.2 寫item.xml

用來顯示每一項item的view視圖

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/imageView1"
        android:textSize="20sp"
        android:textColor="#000000"
        android:text="name" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignLeft="@+id/tv_name"
        android:text="content"
        android:textColor="#88000000"
        android:textSize="18sp" />

</RelativeLayout>

 

 4.3 寫MainActivity.java

package com.example.baseadaptertest;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;


class Person {
    String name;
    String content;
    
    public Person(String name,String content){
        this.name = name;
        this.content = content;
    }
    public String getName() {
        return name;
    }
    public String getContent() {
        return content;
    }
}

public class MainActivity extends Activity {
    
    ArrayList<Person>    list;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //1.添加要顯示的數據
        list  = new ArrayList<Person>();
        list.add(new Person("張三","18歲  電話:158888666"));
        list.add(new Person("李四","21歲  電話:158888777"));
        list.add(new Person("王二","23歲  電話:158888877"));
        list.add(new Person("孫武","25歲  電話:158888997"));
        
        //2.設置Adapter
        ListView lv_list = (ListView)findViewById(R.id.lv_list);
        lv_list.setAdapter(new MyAdapter());
        
    }
    
    
    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            
            View view = null;
            
            //如果convertView為空則需要重新創建資源視圖,如果不為空則表示可以用來複用.無需再次new一個view來使用.
            if(convertView==null){
                 //通過R.layout.item 來創建一個item視圖資源
                 view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
            }else{
                
                view = convertView;
            }
            
            //設置要顯示的內容
            TextView  tv_name =  (TextView)view.findViewById(R.id.tv_name);
            TextView  tv_content =  (TextView)view.findViewById(R.id.tv_content);
            
            tv_name.setText(list.get(position).getName());
            tv_content.setText(list.get(position).getContent());
            
            
            return view;
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

 

5.使用ArrayAdapter適配器

 ArrayAdapter數組適配器用於綁定格式單一的數據,每個item只有一個數據需要被修改,數據源可以是集合或者數組

並且ArrayAdapter可以直接用來使用,無需再繼承此類來實現.

ArrayAdapter的構造方法常用的有兩種:

public ArrayAdapter(Context context, int resource, T[] objects);
//第一個參數 上下文
//第二個參數 包含且只有一個textview的佈局文件id
//第三個參數 要展示的數據數組

public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
//第一個參數 上下文
//第二個參數 可以包含很多內容(ImageView、textview等)的佈局文件id
//第三個參數 指向resource中要顯示數據的一個textView控制項id
//第三個參數 要展示的數據數組

接下來,我們使用第二種構造方法來演示.

效果如下:

 

 

5.1 寫activity_main.xml

只是添加了一個ListView,內容和BaseAdapter的activity_main.xml一致

5.2 寫item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="name"
        android:textColor="#AA000000"
        android:textSize="40sp" />

</LinearLayout>

 

5.3 寫MainActivity.java

package com.example.arrayadapter;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //定義一個String數組
        String[] objects = {"李白","姜子牙","李元芳","高漸離","後羿","王昭君","虞姬"};
        
        //初始化ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_content, objects);
        
        //設置ArrayAdapter
        ListView  lv_list = (ListView)findViewById(R.id.lv_list);
        lv_list.setAdapter(adapter);
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

 

 

6.使用SimpleAdapter適配器

SimpleAdapter適配器適用於擁有多數據的item. 每個item通過Map集合來實現.而Map里則可以包含多個數據.

SimpleAdapter的構造方法如下所示:

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,

            int resource, String[] from, int[] to);

//context: 上下文,填入getApplicationContext()即可
//data:包含了Map(String ,Object)的List數組,每個Map表示每個item數據。
//resource:要載入item的xml佈局文件Id
//from:string數組, 用來標識一個item需要設置哪些key.而key對應的value則是要顯示的數據
//to:int數組,填入item xml佈局文件里的要更改的控制項內容ID號 ,用來對應from中的key值,表示設置的key值最終是更改哪些控制項內容

效果如下:

 

6.1 寫activity_main.xml

只是添加了一個ListView,內容和BaseAdapter的activity_main.xml一致

6.2 寫item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/imageView1"
        android:textSize="17sp"
        android:textColor="#000000"
        android:text="name" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignLeft="@+id/tv_title"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tv_title"
        android:text="content"
        android:textColor="#88000000"
        android:textSize="15sp" />

</RelativeLayout>

 

6.3 寫MainActivity.java

package com.example.simpleadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        
        
        List<Map<String, String>> data = new ArrayList<Map<String,String>>();
        String[] from = {"title","content"};//用來標識一個item需要設置哪些key.而key對應的value則是要顯示的數據,這裡設置了2個key
        int[] to={R.id.tv_title,R.id.tv_content}; //填入要更改的控制項內容ID號 ,用來對應from中的兩個key值,
        
        
        //添加內容
        Map<String, String>  map1 = new HashMap<String, String>();
        map1.put("title", "成都5.1級地震");
        map1.put("content", "成都市青白江區5.1級地震尚無人員傷亡報告");
        data.add(map1);
        
        Map<String, String>  map2 = new HashMap<String, String>();
        map2.put("title", "英雄聯盟手游即將上線");
        map2.put("content", "期待已久的英雄聯盟即將上線...");
        data.add(map2);
        
        Map<String, String>  map3 = new HashMap<String, String>();
        map3.put("title", "英語專四考試延期");
        map3.put("content", "2020年英語專四專八考試延期...");
        data.add(map3);
        
        Map<String, String>  map4 = new HashMap<String, String>();
        map4.put("title", "上海出台減負政策");
        map4.put("content", "上海發佈抗疫企業減負政策 中小微企業:希望繼續加大...");
        data.add(map4);
        
        Map<String, String>  map5 = new HashMap<String, String>();
        map5.put("title", "最硬核科蜜");
        map5.put("content", "史上最硬核科蜜!穿著24號肩扛RPG佇立戰火中...");
        data.add(map5);
        
        //初始化SimpleAdapter
        SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, from, to);
        
        
        //設置SimpleAdapter
        ListView  lv_list = (ListView)findViewById(R.id.lv_list);
        lv_list.setAdapter(adapter);
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

 

 

Ps:如果要設置Item點擊事件,則通過下麵方法設置即可

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

               //寫要實現的事
            }
 });

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 今天要分享的這篇就是2013年痞子衡剛入職飛思卡爾半導體MCU軟體團隊時為了學習C編碼規範所翻譯的(外企嘛,各種資料都是洋文),當時飛思卡爾剛成立MCU軟體團隊不久,那時候Kinetis SDK也還沒有正式推出,整個團隊必須要有一個統一且良好的編碼風格,這樣寫出來的SDK才符合大廠身份。 ...
  • 業界一直在尋求取代SRAM。其中之一包括自旋轉移力矩MRAM(STT-MRAM)。新的存儲器帶來了一些大膽的主張。例如STT-MRAM具有SRAM的速度和快閃記憶體的無波動性,具有無限的耐用性。 圖1.STT-MRAM的MJT細胞 everspin已經為SSD提供SST-MRAM設備。此外一些晶元製造商正 ...
  • Flink中的時間類型和視窗是非常重要概念,是學習Flink必須要掌握的兩個知識點。Flink中的時間類型時間類型介紹Flink流式處理中支持不同類型的時間。分為以下幾種:處理時間Flink程式執行對應操作的系統時間。所有基於時間的操作(例如:時間視窗)都將使用運行相應operator的系統時間。例... ...
  • 每一種數據存儲系統,對應有一種存儲模型,或者叫存儲引擎。我們今天要介紹的是三種比較流行的存儲模型,分別是:Hash存儲模型B-Tree存儲模型LSM存儲模型不同存儲模型的應用情況1、Hash存儲模型redismemcache2、B-Tree存儲模型MySQL(以及大多數的關係型資料庫)MongoDB... ...
  • 生成器設計思路: 連接資料庫 獲取表結構 生成文件 1 下載與安裝 "官網文檔入口" "最方便的 maven 插件使用方式" 貼至pom 文件 2 新建配置文件 "填充配置信息(官網示例)" 項目實例 3 生成文件 預設不覆蓋已有文件,重覆生成文件後果 不過,可以設置可覆蓋 但是註意,對於 xml ...
  • SqlServer 利用游標批量更新數據 Intro 游標在有時候會很有用,在更新一部分不多的數據時,可以很方便的更新數據,不需要再寫一個小工具來做了,直接寫 SQL 就可以了 Sample 下麵來看一個實際示例: Another Sample and more More 在做一些小數據量的數據操作 ...
  • redis中並沒有專門給跳躍表兩個文件。在5.0.7的版本中,結構體的聲明與定義、介面的聲明在server.h中,介面的定義在t_zset.c中,所有開頭為zsl的函數。 一、數據結構 單個節點: typedef struct zskiplistNode { //key,唯一 sds ele; // ...
  • ANALYZE的介紹 使用ANALYZE可以收集或刪除對象的統計信息、驗證對象的結構、標識表或cluster中的行遷移/行鏈接信息等。官方文檔關於ANALYZE功能介紹如下: · Collect or delete statistics about an index or index partiti... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...