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.更多

泛型类,类型匹配符等,详见http://www.runoob.com/java/java-generics.html

二 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:都带有一个单选框

三 特别感谢

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

1.java菜鸟教程http://www.runoob.com/java/java-generics.html

2.“会飞的一只狼”的博客https://www.cnblogs.com/huolan/p/5126794.html

3.360问答https://wenda.so.com/q/1362970519069230

猜你喜欢

转载自blog.csdn.net/qq_41024819/article/details/81136250