android 中listview之BaseAdapter的使用

来源:http://www.cnblogs.com/qifengshi/archive/2016/01/18/5056468.html
-Advertisement-
Play Games

Listview控制項不像其他安卓控制項那種直接拖拽到界面上就能用,而是採用類似J2EE中的MVC模型的方式使用,需要通過適配器將某種樣式的數據或控制項添加到其上而使用.MVC模型實現原理是 數據模型M(Model) 存放數據,利用控制器C (Controller)將數據顯示在視圖V (View)上。利用...


Listview控制項不像其他安卓控制項那種直接拖拽到界面上就能用,而是採用類似J2EE中的MVC模型的方式使用,需要通過適配器將某種樣式的數據或控制項添加到其上而使用.

MVC模型實現原理是 數據模型M(Model) 存放數據,利用控制器C (Controller)將數據顯示在視圖V (View)上。

利用BaseAdapter實現一個ListView的步驟一般如下:
1 首先準備好需要顯示在LiseView中的數據 ——List
2 然後編寫2 個XML 文件 第一個文件是ListView控制項所在的佈局文件 第二個文件是ListVIew中每一個item的佈局文件
3 創建一個繼承自BaseAdapter的類
4 為ListView綁定適配器 setAdapter(繼承BaseAdapter 類的實例)
5 用傳統方式來覆寫適配器的getView函數和getCount 函數(從參數convertView里映射佈局文件,find各個控制項填充數據)
6 加入ViewHolder類(定義n個控制項的聲明)用convertView.setTag(viewHolder)在View和Object之間關聯,此目的是節省find多次的時間。

步驟一 List的使用

數據源可以有多種形式,比如是一個數組,或者是一個list 其作用是使lisview中每一行顯示出數據源的每一個元素的值。
比如ListView中每一個item只有一個控制項 TextView 則list可以定義成一個字元串數組,或者一個ArrayList
如果ListView中每一個item有很多個控制項,則可以把多個控制項的值類型定義成一個類如Item類 格式如下

public class Item{
    String name;
    String text;
    int number;
    int imageId;
    //省略setter和getter方法
}

則此時List定義成List 並且初始化為

List<Item> listItems = new ArrayList<>();

並賦予值如下

for(int i = 0 ; i < 10 ; i ++){
    Item item = new Item();
    item.setName("sqf");
    item.setText("Hello World");
    item.setNumber(i);
    item.setImageId( R.drawable.ic_launcher);
    listItems.add(item);
}

或者將多個控制項的值的類型包裝成Map ,改成如下格式:

List<Map<String , Object>> listItems = new ArrayList<Map<String , Object>>();
Map<String, Object> map;  
for(int i=0;i<10;i++)  
{  
    map = new HashMap<String, Object>();  
    map.put("imageId", R.drawable.ic_launcher);  
    map.put("text", "hello World");  
    map.put("name" , "sqf");
    map.put("number", i);  
    listItems.add(map);  
 }  

此時list已經構建完畢,已經得到了需要加入ListView中的值了。

步驟二 編寫需要ListView佈局文件以及ListView中item的佈局文件

ListView佈局文件的例子如下:
activity所在的佈局XML中只需要含有listview的控制項,listview中每一行的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="vertical">

   <ListView android:id="@+id/list_view"
       android:layout_height="match_parent"
       android:layout_width="match_parent">

   </ListView>
</LinearLayout>

ListView的Item的佈局文件

<?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="vertical">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="20dp"
        android:gravity="center_horizontal"
        android:textSize="20dp"/>

</LinearLayout>

步驟三 創建一個繼承自BaseAdapter的類

例子如下所示:

private class ExampleAdapter extends BaseAdapter{

        private LayoutInflater mInflater = null;

        private ExampleAdapter(Context context){
            this.mInflater = LayoutInflater.from(context);
        }

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

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

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }
    }

這裡主要需要重寫的方法有getcount 和getView 因為在繪製listview的時候需要多次調用getcount方法和getView方法。這裡getCount的返回值就是第一步裡面定義的listItems大小。同時在這個類里定一個成員變數mInflater和一個構造方法。

layoutInflater的作用

LayoutInflater的作用類似於findviewById() .不同在於LayoutInflater是用來找res/layout下的xml佈局文件,並且實例化。
具體作用如下:1 對於一個沒有載入或者想要動態載入的界面,都需要使用Layoutinflater.inflater() 來載入。
2 對於已經載入的界面,就可以使用Activity.findViewById()方法來獲取其中的界面元素。

獲得layoutInflater實例的三種方式

1 layoutinflater inflater = getLayoutInflater();
2 LayoutInflater localinflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

3 LayoutInflater inflater = LayoutInflater.from(context)

這三種的本質都是調用context.getSystemService()

獲得實例之後可以通過實例調用該類的方法inflate 這個方法有一下幾種的過載形式,返回值均為View對象.

public View inflate (int resource, ViewGroup root)  
public View inflate (XmlPullParser parser, ViewGroup root)  
  
public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  
  
public View inflate (int resource, ViewGroup root, boolean attachToRoot)  

示例代碼如下:

 LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);  
 //下麵第二個參數可以為Null
  
View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));  
  
//EditText editText = (EditText)findViewById(R.id.content);// error  
EditText editText = (EditText)view.findViewById(R.id.content);  

步驟四 為ListView 綁定適配器

首先實例化自定義的Adapter,然後找到listview視圖的對象,用setAdapter方法為ListVIew綁定適配器。
例子如下:

 private ListView listview;
 private ExampleAdapter adapter = new ExampleAdapter();
 listview.setAdapter(adapter);

步驟五 六 覆蓋getView方法

View getView():返回列表項對應的視圖,方法體中

1 ◆實例化視圖填充器

2 ◆用視圖填充器,根據Xml文件,實例化視圖

3 ◆根據佈局找到控制項,並設置屬性

4 ◆返回View視圖
實例如下:

public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder = new ViewHolder();
            if(convertView == null){
                convertView = mInflater.inflate(R.layout.item_list_view,null);
                viewHolder.textView = (TextView)convertView.findViewById(R.id.list_view_text);
                convertView.setTag(viewHolder);
            }else{
                viewHolder = (ViewHolder) convertView.getTag();
            }

            viewHolder.textView.setText(listItems.get(position));

            return convertView;
        }


        private class ViewHolder{
            TextView textView;
        }

這裡調用自帶的convertview ,如果緩存為空 將LayoutInflater的實例賦給convertview,convertview用來存儲載入佈局(listview的item 的layout)的layout.xml,同時在講載入佈局內的findViewById的值放到viewHoler中。如果convertview不為空,則將findviewById的值取出來。這裡就完成了實例化視圖以及根據佈局查找控制項。接下里將存儲數據的listItems來給view中的控制項設置屬性。最後返回view視圖。


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

-Advertisement-
Play Games
更多相關文章
  • css如何實現未知寬高div中圖片垂直水平居中效果:在有時候可能有這樣的情況,那就是想讓一個圖片在div中實現垂直水平居中效果,但是有時候div的尺寸是位置的,下麵通過代碼實例介紹一下在這種情況下如何實現圖片的垂直水平居中效果。代碼如下:實例一:螞蟻部落上面你的代碼可以讓圖片垂直水平居中,當然這裡,...
  • 點擊回車實現按鈕點擊功能:在實際應用中,可能有這樣的需求,點擊一個按鈕可以執行一個功能,當點擊回車的時候也可以實現此功能,也就是說點擊回車的時候也觸發的點擊事件,下麵就通過代碼實例介紹一下如何實現此功能。代碼如下:螞蟻部落 以上代碼實現了我們的要求,點擊按鈕或者點擊回車都可以將div的背景色設置為藍...
  • js將數組轉換為字元串:有時候將數組元素轉換成一個字元串更容易操作,下麵就通過代碼實例介紹一下如何實現此效果。代碼實例如下:var arr=[1,2,4,5,6,2,4];console.log(arr.join(""));使用Array自帶的join()函數即可實現此效果。關於join()函數可以...
  • 利用div和css製作三角形效果:本章節介紹一下如何利用div和css實現三角形效果,雖然看起來表神奇,但是原理是非常的簡單。代碼如下:螞蟻部落其實這個三角形是利用div的邊框"擠出"來的,邊框由於採用了不同的顏色,所以很好區分,如果只保留一個方位的三角形,可以自行設置邊框顏色或者刪除邊框就可以了。...
  • UITabBarController是開發中經常會用到的一個視圖控制器,但是預設的UITabBarController經常不能夠完全滿足我們的需求,所以我們經常需要自定義一個UITabBarController。 接下來,我們就來自定義一個UITabBarController。首先我們應該明白...
  • 線程通信、ActivityThread及Thread類是理解Android線程管理的關鍵。 線程,作為CPU調度資源的基本單位,在Android等針對嵌入式設備的操作系統中,有著非常重要和基礎的作用。本小節主要從以下三個方面進行分析: 《Android線程管理(一)——線程通信》 《Android線...
  • 一,效果圖。二,工程圖。三,代碼。RootViewController.h#import //加入頭文件#import "DCPathButton.h"@interface RootViewController : [email protected]#i...
  • KOTLIN開發語言文檔(官方文檔)第二章、基本概念
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...