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:都帶有一個單選框
三 特別感謝
文章主要摘自以下幾部分,加上部分自我感悟