1. 程式人生 > >Android 泛型與ArrayAdapter介面卡 初步入門

Android 泛型與ArrayAdapter介面卡 初步入門

在看第一行程式碼時,多次見到介面卡ArrayAdapter(其實也沒幾次),發現這部分知識完全不瞭解,就去了解一下,特此整理如下。

一 Java泛型

1.泛型簡介

java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時型別安全檢測機制,該機制允許程式設計師在編譯時檢測到非法的型別。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。(看得很懵是吧,我也是。那我們舉個例子)

假定我們有這樣一個需求:寫一個排序方法,能夠對整型陣列、字串陣列甚至其他任何型別的陣列進行排序,該如何實現?答案是可以使用 Java 泛型。使用 Java 泛型的概念,我們可以寫一個泛型方法來對一個物件陣列排序。然後,呼叫該泛型方法來對整型陣列、浮點數陣列、字串陣列等進行排序。

2.泛型方法

直接舉例子,這裡定義了一個泛型方法printArray,定義時有一個<E>放在函式返回值前面,你可以理解成E就是一種資料型別,但是不管是什麼資料型別,都是進行同樣的操作,所以這裡可以用泛型方法。  在主函式中呼叫時,分別傳入整形陣列,浮點型和字元型陣列,都可以輸出其全部元素。

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 輸出陣列元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
        // 建立不同型別陣列: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型陣列元素為:" );
        printArray( intArray  ); // 傳遞一個整型陣列
 
        System.out.println( "\n雙精度型陣列元素為:" );
        printArray( doubleArray ); // 傳遞一個雙精度型陣列
 
        System.out.println( "\n字元型陣列元素為:" );
        printArray( charArray ); // 傳遞一個字元型陣列
    } 
}

看了這個,或許能理解到一點“泛型”的意義了。

3.java中的List(好像不屬於泛型,管他呢,先放這)

List<E>( []內的內容可省略),與陣列類似:但是長度可變,應該是能+-50%?
例項化:List[<資料型別>] list = new ArrayList[<資料型別>]();
一些方法舉例(後面會遇到)

獲得集合內元素個數:list.size();
新增元素:
預設新增:list.add(e);

4.更多

二 android中的ArrayAdapter介面卡

介面卡是一個非常重要的知識點,Adapter是用來幫助填出資料的中間橋樑,簡單點說吧:將各種資料以合適的形式顯示在View中給使用者看。Adapter有很多的介面、抽象類、子類可以使用。主要有BaseAdapter,ArrayAdapter,SimpleAdapter。

ArrayAdapter(陣列介面卡),這個介面卡使用有一定的侷限性,只能顯示一行文字資料。支援泛型。

先建一個layout,只有一個ListView.

<?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/ll1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

再看一下Activity中的程式碼,比較明顯,新建了一個數組作為要傳入的資料,新建ArrayAdapter型別的的adapter,通過建構函式,構造出合適的介面卡,最後,呼叫listview的setAdapter方法傳入介面卡。

package com.example.test3;

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

public class MainActivity extends Activity{
//    定義要顯示的資料
    private String[] datas = {"張三","李四","王五","麻子","小強"};
    private ArrayAdapter<String> adapter;
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.ll1);
//        初始化介面卡
        adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);
        listView.setAdapter(adapter);
    }
}

泛型的支援

這次沒有使用陣列作為原始資料,而是使用的泛型,並將泛型的型別指定為字串。

最後,關於ArrayAdapter的構造方法傳入的引數

第一個引數:context上下文物件

第二個引數:每一個item的樣式,可以使用系統提供,也可以自定義就是一個TextView

第三個引數:資料來源,要顯示的資料

系統提供的item的樣式,可以試一試

simple_list_item1:單獨的一行文字框

simple_list_item2:有兩個文字框組成

simple_list_item_checked每項都是由一個已選中的列表項

simple_list_item_multiple_choice:都帶有一個複選框

simple_list_item_single_choice:都帶有一個單選框

三 特別感謝

文章主要摘自以下幾部分,加上部分自我感悟