简单好用的Adapter---ArrayAdapter

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

ListView中比较简单但又非常方便的ArrayAdapter。

    ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造。

先来看一个简单的例子:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listView = (ListView) this.findViewById(R.id.list);UserAdapter adapter = new UserAdapter(this, R.layout.list_item);adapter.add(new User(10, "小智", "男"));adapter.add(new User(10, "小霞", "女"));listView.setAdapter(adapter);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}class UserAdapter extends ArrayAdapter<User> {private int mResourceId;public UserAdapter(Context context, int textViewResourceId) {super(context, textViewResourceId);this.mResourceId = textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {User user = getItem(position);LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(mResourceId, null);TextView nameText = (TextView) view.findViewById(R.id.name);TextView ageText = (TextView) view.findViewById(R.id.age);TextView sexText = (TextView) view.findViewById(R.id.sex);nameText.setText(user.getName());ageText.setText(user.getAge());sexText.setText(user.getSex());return view;}}class User {private int mAge;private String mName;private String mSex;public User(int age, String name, String sex) {this.mAge = age;this.mName = name;this.mSex = sex;}public String getName() {return this.mName;}public String getAge() {return this.mAge + "";}public String getSex() {return this.mSex;}}

这里自定义了一个ArrayAdapter,有关于Adapter的使用在之前的SimpleAdapter中已经涉及到了,所以这里直接就是以自定义的ArrayAdapter作为例子。
     我们这里需要将学生的信息罗列出来,需要三个TextView:

<?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" ><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/age"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/sex"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

30171238_W2FR.png

在自定义ArrayAdapter的时候,最神奇的地方就是我们可以指定ArrayAdapter绑定的数据类型,可以是基本数据类型,也可以是自定义的对象类型,像是这次的User类型。对于自定义的ArrayAdapter的构造方法,存在很多形式,这次是传进一个View的资源Id,但是我们也可以指定绑定的数据类型。
     ArrayAdapter的神奇之处就是我们竟然可以像是操作Array一样来操作ArrayAdapter!像是例子中的添加操作,而其他的适配器都是需要传进一个容器的。ArrayAdapter为什么可以处理对象类型的数据呢?其实,ArrayAdapter是使用数组中对象的toString()方法来填充指定的TextView,所以我们可以通过重写对象的toString()方法来自定义ListView的显示。

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {User user = getItem(position);LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(mResourceId, null);TextView text = (TextView) view.findViewById(R.id.info);text.setText(user.toString());return view;}class User {private int mAge;private String mName;private String mSex;public User(int age, String name, String sex) {this.mAge = age;this.mName = name;this.mSex = sex;}@Overridepublic String toString() {return "姓名:" + mName + " " + "年龄:" + mAge + " " + "性别:" + mSex;}}

 这样我们可以只在一行中显示所有数据。

30171239_6E8r.png

使用ArrayAdapter最大的疑问就是我们是否需要将一个现成的容器传入ArrayAdapter中?原本ArrayAdapter本身就用一般容器的基本操作,像是添加新的元素等,但它本身并不能完成当成容器使用,我们更多的时候是要将一个容器中的元素交给ArrayAdapter,由后者决定它的显示形式。

class UserAdapter extends ArrayAdapter<User> {private int mResourceId;public UserAdapter(Context context, int textViewResourceId,List<User> users) {super(context, textViewResourceId, users);this.mResourceId = textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {User user = getItem(position);LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(mResourceId, null);TextView text = (TextView) view.findViewById(R.id.info);text.setText(user.toString());return view;}}
List<User> users = new ArrayList<User>();
users.add(new User(10, "小智", "男"));
users.add(new User(10, "小霞", "女"));
UserAdapter adapter = new UserAdapter(this, R.layout.list_item, users);
listView.setAdapter(adapter);

如果我们将ArrayAdapter绑定的数据类型定义为Object,我们可以自由的传入任何类型的容器而不需要任何有关类型转换的操作!

       ArrayAdapter不仅仅是可以显示TextView,它当让也像是其他Adapter一样,可以显示任何其他非TextView的组件:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listView = (ListView) this.findViewById(R.id.list);List<Object> users = new ArrayList<Object>();users.add(10);users.add(11);UserAdapter adapter = new UserAdapter(this, R.layout.list_item,R.id.info, users);listView.setAdapter(adapter);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}class UserAdapter extends ArrayAdapter<Object> {private int mResourceId;public UserAdapter(Context context, int resourceId,int textViewResourceId, List<Object> users) {super(context, resourceId, textViewResourceId, users);this.mResourceId = resourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Object user = getItem(position);LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(mResourceId, null);TextView text = (TextView) view.findViewById(R.id.info);text.setText(user.toString());return view;}}
<?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" ><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点击" /><TextViewandroid:id="@+id/info"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

30171239_m4ID.png

如果我们的布局中需要其他组件,必须指定该布局中用于显示ArrayAdapter中数据的TextView的Id。

     如果只是方便绑定数据的话,其实是没有必要专门独立个ArrayAdapter出来,只要覆写getView()就可以,正如使用容器就是为了方便大量数据的处理一样的道理,使用ArrayAdapter也是为了处理数据较大的情况,像是超过100条或者频繁动态增删数据时,就可以使用ArrayAdapter,而且,为了方便我们刷新UI,ArrayAdapter也提供了setNotifyOnChange()方法,这样可以降低UI的处理量,使得刷新UI更加快速,主要是通过停止对add,insert,remove和clear的操作来实现这点。


转载于:https://my.oschina.net/kutengshe/blog/472585

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表单数据自动录入_Excel总表录入、分表自动更新,只要数据透视表和一个快捷键就行...

合并多个分表到一个总表中&#xff0c;这样的操作很常见。但&#xff0c;有时候我们也需要反过来&#xff0c;即将一个总表拆分成多个子表&#xff0c;并且在总表中录入/修改数据后&#xff0c;每个分表都可以自动更新数据。如以下资金流动表。除了资金流水&#xff0c;我们还特…

php 字符串打散为数组,用逗号分隔出数组

字符串打散为数组 <?php $str "Hello world. I love php!"; print_r (explode(" ",$str)); ?> 使用explode可以将一段字符串打散成一个数组&#xff0c;不过&#xff0c;explode使用某个字符打乱&#xff0c;例如以上例子&#xff0c;我在explo…

.net Core中如何限制接口请求次数

.net core中如何限制接口请求次数像AspNetCoreRateLimit这种轮子我前面有给大家介绍过&#xff0c;今天就不说了&#xff0c;我们来聊聊背后的原理&#xff0c;欢迎各位大佬指正&#xff01;像我们经常看的一些APi请求接口网站&#xff1a;拿请求国外主要城市的七日接口举例&am…

[老老实实学WCF] 第二篇 配置WCF

老老实实学WCF 第二篇 配置WCF 在上一篇中&#xff0c;我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它。先回顾一下服务端的代码&#xff1a; [csharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Te…

linux之setsid命令

1 setsid命令 setsid主要是重新创建一个session,子进程从父进程继承了SessionID、进程组ID和打开的终端,子进程如果要脱离父进程&#xff0c;不受父进程控制&#xff0c;我们可以用这个setsid命令 2 测试 比如我们ping baidu.com setsid ping baidu.com 这个时候我们再ctrl…

【ArcGIS遇上Python】三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例

时至今日,笔者已经总结了三种用Python语言结合ArcGIS10.x提供的接口去批量处理地理空间数据的方法。即: 1. 用IDLE、Python Tools for Visual Studio等去编写独立的py脚本文件; 2. 用Python提供的tKinter模块去构建可视化窗体,并将其打包成exe可执行文件; …

【深入JAVA】java注解

在阅读的过程中有不论什么问题&#xff0c;欢迎一起交流 邮箱&#xff1a;1494713801qq.com QQ&#xff1a;1494713801 1、什么是java注解 注解&#xff0c;顾名思义&#xff0c;注解,就是对某一事物进行加入凝视说明&#xff0c;会存放一些信息。这些信息可能对以后某…

vlan跨交换机 udp广播_【详解】VLAN和VXLAN有何区别?VXLAN运用场景有哪些?

随着网络技术的发展&#xff0c;云计算凭借其系统利用率高、人力/管理成本低以及灵活性/扩展性方面展现的优势&#xff0c;已经成为目前各大行业IT建设的新趋势。而服务器的虚拟化作为云计算的核心技术之一&#xff0c;也得到了越来越多的应用&#xff0c;从而极大的增加了数据…

linux tcp 内核模块,C – Linux – 内核模块 – TCP头

我正在尝试创建linux内核模块,它将检查传入的数据包.目前,我正在提取数据包的TCP标头并读取源和目标端口 – >但是我得到的值不正确.我有钩功能&#xff1a;unsigned int hook_func(unsigned int hooknum,struct sk_buff *skb,const struct net_device *in,const struct net…

C#11:原始字符串

这一直以来是我写代码的一个痛点&#xff0c;C#11终于解决了&#xff0c;那就是我想把一个整齐的格式的json字符串转出&#xff0c;但不能如愿&#xff0c;要不用一个三方库来搞定&#xff0c;要不就加各种双引号&#xff0c;如果有变量还得小心处理{}&#xff0c;因为在C#stri…

php in_array 判断数组中是否存在此元素

判断数组中是否存在此元素在php中很简单&#xff0c;直接使用 in_array即可。用法如下 &#xff1a; <?php $array_1array(red,blue,green); if(in_array(red1, $array_1)){echo 1; }else{echo 2; }以上例子我新建了一个数组array_1&#xff0c;里面的值想必也看到了。…

Android开源项目SlidingMenu本学习笔记(两)

我们已经出台SlidingMenu使用&#xff1a;Android开源项目SlidingMenu本学习笔记&#xff08;一个&#xff09;&#xff0c;接下来再深入学习下。依据滑出项的Menu切换到相应的页面 文件夹结构&#xff1a; 点击Bluetooth能够切换到对应的界面 关键代码 MainActivity.java pack…

Makefile的学习

1 Makefile 就这样理解&#xff0c;帮我们对程序进行编译&#xff0c;我们每次gcc g啥的很麻烦 2 举例子 我这里有3个文件first.c second.c third.c first.c文件如下 #include <stdio.h> int add(int a, int b) {return a; } second.c文件如下 int sub(int a, int …

扒开系统调用的三层皮(下)

5234 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.给MenuOS增加time和time-asm命令 步骤 rm menu -rf //强制删除git clonehttp://github.com/menging/menu.git // 克隆相关信息到menucd menumake rootfs //自动编…

Python版九九乘法表

1、示例一 >>> for i in range(10):s=for j in range(1,i+1):s+=str(j)+*+str(i)+=+str(j*i)+\tprint s 2、示例二 >>> for i in range(10):s=for j in range(1,i+1):s+=str(j)+*+str(i)+=+repr(j*i).ljust(4)print s 3、示例三 >>> for i in ran…

R 语言 相关入门资料

《R语言基础语法入门》&#xff1a; http://www.xueqing.tv/upload/april-training/day1/index.html#1 转载于:https://www.cnblogs.com/pinganzi/p/7354679.html

Tiny之Web工程构建

友情提醒&#xff1a;阅读此文需要java、Maven环境搭建技能&#xff0c;关于java开发环境及maven环境搭建请咨询谷哥和度娘。 搭建TinyWeb工程环境 搭建一下TinyWeb的开发环境&#xff0c;是非常简单的 如果你没有下载过Tiny框架&#xff0c;请在命令行中输入下面的命令&…

linux 端口 流量统计,Linux下如何对端口流量进行统计

在不修改源代码的情况下对程序暴露端口流量进行监控统计&#xff0c;可以利用Linux中自带的Iptable添加简单的规则让其起到端口流量统计的作用。但是需要注意的是在服务器重启、Iptable服务重启的时候统计数据会被重置清零。添加需要统计的端口1、输入监控下面示例是监控目标端…

Hello Playwright:(1)从开发到部署

前言虽然前面写过几篇 C# 使用 Playwright 的文章&#xff0c;但是讲解的不太全面。看到有朋友有学习这方面的需要&#xff1a;因此&#xff0c;就有了《Hello Playwright》这个系列的产生。Playwright 介绍Playwright 是微软开源的一个基于 Node.js 的工具库&#xff0c;可使用…

没有主清单属性_原神:晴知的主C诺艾尔大型进阶攻略初版

作者&#xff1a;NGA-最可爱的晴知前言大家好我是晴知&#xff0c;一个诺艾尔主C玩家(目前是0命座)&#xff0c;截至10月8日&#xff0c;我的账号等级为41级&#xff0c;深境螺旋11层打通&#xff0c;但星数不够12层&#xff0c;一者因为圣遗物太烂而我想45级再刷圣遗物&#x…