ArrayAdapter是一个很简单的适配器,是BaseAdapter的子类。

ArrayAdapter绑定的数据是集合或数组,比较单一。视图是列表形式,ListView 或 Spinner.

ArrayAdapter先看下它的构造方法有哪些,如下6种:

ArrayAdapter(Context context, int resource)
context:当前的上下文,不能为null
resource:布局的资源ID,实例化视图是TextView

ArrayAdapter(Context context, int resource, T[] objects)
ArrayAdapter(Context context, int resource, List<T> objects)
context:同上,不能为null
resource:布局的资源ID,实例化视图是TextView
objects:数据集合,不能为null

上面3种,类似下面的示意图。每一项布局文件就是一个textview, 数据直接填充到textview中,只是构造时数据源不同(不包含,数组或List)

ArrayAdapter(Context context, int resource, int textViewResourceId)
context:同上,不能为null
resource:布局的资源ID,包含一个textview
textViewResourceId:要填充的布局资源中的TextView的id

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
context:同上,不能为null
resource:布局的资源ID,包含textview
textViewResourceId:要填充的布局资源中的TextView的id
objects:数据集合,不能为null

上面3种,类似下面的示意图。每一项的布局文件中包含一个textview, 数据填充到指定的textview中,只是构造时数据源不同(不包含,数组或List)

说明:

一共有6种构造方法,大致分为了上述两类。下面示例使用了第二个,第五个构造方法,都是数组形式的数据源。

T[] objects和List<T> objects的区别:

T[] objects会使数据不可变,所以在使用clear() add()等方法时会报出异常。List<T> objects不会抛出异常,可以进行操作。

文章最后也对这个做示例详细说明。

直接用ListView,不构造ArrayAdapter

布局文件,array_adapter_act1.xml.直接在ListView写上数据。

<?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">
<ListView
android:id="@+id/array_adapter_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/array_adapter_strs"
/>
</RelativeLayout>

数据数据如下:

    <string-array name="array_adapter_strs">
<item>11</item>
<item>22</item>
<item>33</item>
<item>44</item>
<item>55</item>
</string-array>

Activity调用如下:

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.array_adapter_act1 ); ListView listView = findViewById( R.id.array_adapter_listview );
listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString() );
}
} );
}

效果如图,点击打印正常。如点击第一个,log:D/Adapter: onItemClick: position=0;text=11

ArrayAdapter(Context context, int resource, T[] objects)

布局array_adapter_act2.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">
<ListView
android:id="@+id/array_adapter_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>

Activity调用:

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.array_adapter_act2); ListView listView = findViewById( R.id.array_adapter_listview );
String[] datas = {"AA", "BB", "CC", "DD", "EE"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.array_adapter_item, datas);
listView.setAdapter( adapter );
listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString() );
}
} );
}

array_adapter_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity="center">
</TextView>

效果如下图,点击第一个,log:D/Adapter: onItemClick: position=0;text=AA

说明:

1.注意最开始第二个参数的说明,这里需要一个实例化视图是TextView的布局。

2.系统已提供了几种item的样式(第二个参数,TextView布局),一般直接使用系统的即可,不需要自定义了。如:

android.R.layout.simple_list_item_1:单行的文本,效果如直接使用ListView的图一样(第一张图)。
android.R.layout.simple_list_item_checked:带选择标识的
simple_list_item_multiple_choice:带复选框

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)

布局文件,array_adapter_act2.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">
<ListView
android:id="@+id/array_adapter_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>

Activity调用:

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.array_adapter_act2); ListView listView = findViewById( R.id.array_adapter_listview );
String[] datas = {"11AA", "22BB", "33CC", "44DD", "55EE"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.array_adapter_item2,
R.id.array_adapter_text22, datas);
listView.setAdapter( adapter );
listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d( TAG, "onItemClick: position="+ position + ";text=" + parent.getItemAtPosition(position).toString() );
}
} );
}

array_adapter_item2.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="40dp">
<TextView android:id="@+id/array_adapter_text22"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
</LinearLayout>

效果如下图,点击第一个打印log:D/Adapter: onItemClick: position=0;text=11AA

T[] objects和List<T> objects两种数据源的区别

最初已经讲过了,T[] objects会使数据不可变,所以在使用clear() add()等方法时会报出异常。List<T> objects不会抛出异常,可以操作。

我们简单一起来看下:

  • T[] objects类型数据源

     ListView listView = findViewById( R.id.array_adapter_listview );
String[] datas = {"111", "222", "333"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
listView.setAdapter( adapter );

上面代码,是T[] objects类型数据源,会显示3项单行,如图

如果,使用add() 或 clear等方法操作:

ListView listView = findViewById( R.id.array_adapter_listview );
String[] datas = {"111", "222", "333"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
adapter.add( "aaa" );
listView.setAdapter( adapter );

这样就会报错:

    java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.flx.adaptertest/com.flx.adaptertest.arrayadapter.ArrayAdapterActivity2}: java.lang.UnsupportedOperationException
  • List<T> objects类型数据源

ListView listView = findViewById( R.id.array_adapter_listview );
List<String> datas = new ArrayList<>();
datas.add("111");
datas.add("222");
datas.add("333");
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
listView.setAdapter( adapter );

上述代码,如T[] objects类型数据源效果一样,不截图了。

使用add()等方法操作会怎样呢?

ListView listView = findViewById( R.id.array_adapter_listview );
List<String> datas = new ArrayList<>();
datas.add("111");
datas.add("222");
datas.add("333");
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas);
adapter.add("aaa");
listView.setAdapter( adapter );
adapter.add("bbb");

效果如下:

 操作正常完成。

ArrayAdapter是比较简单的 绑定单一数据的一种适配器,也可以自定义实现稍微复杂点的效果,但其他适配器可能更容易点^v^

Android_适配器(adapter)之ArrayAdapter的更多相关文章

  1. Android_适配器(adapter)之BaseAdapter

    BaseAdapter是应用最多的一种适配了.它是一个抽象类,需要重写方法完成自定义适配器的功能,这就比较自由灵活,能实现各种想要的效果. 之前讲到的SimpleAdapter和ArrayAdapte ...

  2. Android_适配器(adapter)之SimpleAdapter

    概述 SimpleAdapter是一种 简单的适配器,将静态数据映射到布局xml对应的视图上.它也是BaseAdapter的子类. SimpleAdapter数据映射的组件有3类(从官网api或Sim ...

  3. Adapter之ArrayAdapter以及监听器设置

    前言: ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~,我的学习就是通过这个最简单的适配器开始 正文: 完成这个ArrayAdapter需要三步:1.初始化数据 ...

  4. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  5. android适配器Adapter

    一.什么是适配器,适配器有什么用? 适配器是AdapterView视图(如ListView - 列表视图控件.Gallery - 缩略图浏览器控件.GridView - 网格控件.Spinner - ...

  6. (四)适配器Adapter

    只对简单应用进行描述.适配器与ListView配合使用可以快速生成item,效果如下例所示 一.简单模式 方式一 xml <ListView android:id="@+id/lv_t ...

  7. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  8. 【原】模式之-适配器Adapter模式

    适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...

  9. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

随机推荐

  1. 网课应该这么刷(油猴Tampermonkey脚本自动刷课)

    懒人福利 首先有些人不想学怎么用脚本,满足你们,压缩包解压之后直接登录即可.戳我下载 脚本已经集成好了,登录即可刷课.章节测试还会自动答题呦,正确率高达97%呦. 油猴及脚本安装 油猴的脚本不知可以刷 ...

  2. 04 全局局部配置 wxml数据绑定 事件 冒泡

    一. 配置介绍 一个小程序应用程序会包括最基本的两种配置文件.一种是全局的 app.json 和 页面自己的 page.json(index.json /test.json等) 注意:配置文件中不能出 ...

  3. springboot打包启动时报mybatis的typeAlias类名找不到的错误

    springBoot项目在IDEA上面正常但是打包之后运行 出错,错误大致为mybatis解析Mapper.xml时 typeAlias找不到XX类 Mapper里面的标签: <select p ...

  4. 线段树 G - Mayor's posters 小技巧

    G - Mayor's posters POJ - 2528 这个题目要倒着来写,从后面往前面贴,因为前面的有些会被后面的覆盖. 所以我们就判断这张海报的位置有没有完全被覆盖,如果完全被覆盖了就不能贴 ...

  5. Spring Cloud学习 之 Spring Cloud Ribbon(执行流程源码分析)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 分析: 总结: 分析: ​ 在上篇文章中,我们着重分析了RestTempla ...

  6. vue.js 实现点击展开收起动画

    最近公司项目加了个页面,其中要求是这样的,点击对应列表,展开和收起, 其实就是显示和隐藏内容部分:说来惭愧,我花了半天时间才搞出来(自黑一下~), ,,接下来分享给大家,先上效果图: .vue页面: ...

  7. [hdu5249]动态中位数

    题意:3种操作分别为入队,出队,查询当前队列的中位数.操作数为1e5数量级. 思路:先考虑离线算法,可以离散+线段树,可以划分树,考虑在线算法,则有treap名次树,SBtree(size balan ...

  8. PHP EOF使用说明

    PHP EOF(heredoc) 使用说明 PHP EOF(heredoc)是一种在命令行shell(如sh.csh.ksh.bash.PowerShell和zsh)和程序语言(像Perl.PHP.P ...

  9. java遇到的error解决

    解决Cannot change version of project facet Dynamic web module to 2.5 maven 不能设置为web3.0人解决方法 http://www ...

  10. python基本数据类型:字符串及其方法(一)

    大小写转换类 方法一:capitalize()首字母大写字符串 name='hatusne miku' name1=name.capitalize() print(name,name1) 方法二:ti ...