Android——Adapter
Adapter——本身只是一个接口。Adapter是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。
数据适配器作用:把复杂的数据(数组、链表、数据库、集合等)填充在指定视图界面上。
数据适配器是连接数据源和视图界面的桥梁
介绍一下最常用的三个实现类:
1、ArrayAdapter:简单易用,通常用于将数组或List集合的多个值包装成多个列表项。每个列表项只能是TextView。
实现过程:新建适配器——添加数据源到适配器——视图加载适配器
//定义一个数组
String[] arr1 = {"aa","bb","cc"};
//将数组包装为ArrayAdapter
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,R.layout.array_item,arr1);
//为ListView设置Adapter
list.setAdapter(adapter1);//list为ListView组件
创建ArrayAdapter时必须指定如下三个参数:
Context:代表了访问整个Android应用的接口
textViewResourceId:一个资源ID,该资源ID代表了一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。(控制每个列表项组件)
数组或List:该数组或List将负责为多少列表项提供数据。(为列表项提供数据)
2、SimpleAdapter:功能强大,可用于将List集合的多个对象包装成多个列表项
实现过程:新建适配器——添加数据源到适配器——视图加载适配器
举个小例子:一个列表项包含:最左边为图标,接着同一行上边是标题,下面是一些说明文字。
先定义了三个数组,分别存储上述三类。
//创建一个List集合,List集合的元素是Map List<Map<String,Object>> listItems = new ArrayList<Map<String, Object>>();
for(int i =0;i<names.length;i++){
Map<String,Object> listItem = new HashMap<String,Object>();
listItem.put("header",imageIds[i]);
listItem.put("name",names[i]);
listItem.put("desc",descs[i]);
listItems.add(listItem);
}
//创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItems,R.layout.simple_item,
new String[]{"name","header","desc"},new int[]{R.id.name,R.id.header,R.id.desc});
ListView list = (ListView) findViewById(R.id.mylist);
list.setAdapter(simpleAdapter);
五大参数解释:
Context:上下文
data:数据源。是一个List<? extends Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项
Resource:列表项的布局文件ID
from:Map中的键名
to:绑定数据视图中的ID,与from成对应关系
3、BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。
BaseAdapter基本结构
1)public int getCount():适配器中数据集中数据的个数
2)public Object getItem(int position): 获取数据集中与指定索引对应的数据项
3)public long getItemId(int position): 获取指定行对应的ID
4)public View getView(int position, View convertView, ViewGroup parent): 获取每一个Item的显示内容。
ViewHolder优化BaseAdapter思路:
1)创建Bean对象,用于封装数据
2)在构造方法中初始化用于映射的数据List
3)创建ViewHolder类,创建布局映射关系
4)判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHoldr。
5)给ViewHolder中的控件设置数据
详细代码(布局文件未给出):
public class ItemBean { public int itemImageResid;
public String itemTitle;
public String itemContent; public ItemBean(int itemImageResid, String itemTitle, String itemContent) {
this.itemImageResid = itemImageResid;
this.itemTitle = itemTitle;
this.itemContent = itemContent;
}
}
public class MyAdapter extends BaseAdapter {
private LayoutInflater mLayoutInflater;
// 映射数据
private List<ItemBean> mDataList;
private long mSumTime;
public MyAdapter(Context context, List<ItemBean> list) {
mLayoutInflater = LayoutInflater.from(context);
mDataList = list;
}
// 获取数据量
@Override
public int getCount() {
return mDataList.size();
}
// 获取对应ID项对应的Item
@Override
public Object getItem(int position) {
return mDataList.get(position);
}
// 获取对应项ID
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 逗比式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 获取纳秒时间 更加精确
long start = System.nanoTime();
// 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
View view = mLayoutInflater.inflate(R.layout.item, null);
// 实例化控件
ImageView itemImage = (ImageView) view.findViewById(R.id.iv_image);
TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);
TextView itemContent = (TextView) view.findViewById(R.id.tv_content);
// 取出bean对象
ItemBean bean = mDataList.get(position);
// 设置控件的数据
itemImage.setImageResource(bean.itemImageResid);
itemTitle.setText(bean.itemTitle);
itemContent.setText(bean.itemContent);
long end = System.nanoTime();
long dValue = end - start;
mSumTime += dValue;
// 输出每次getView消耗的时间和
Log.d("xys", String.valueOf(mSumTime));
return view;
// 逗比式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>24409529
// 普通式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 获取纳秒时间 更加精确
// long start = System.nanoTime();
// if (convertView == null) {
// 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
// convertView = mLayoutInflater.inflate(R.layout.item, null);
// }
// ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_image);
// TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);
// TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);
// // 取出bean对象
// ItemBean bean = mDataList.get(position);
// 设置控件的数据
// itemImage.setImageResource(bean.itemImageResid);
// itemTitle.setText(bean.itemTitle);
// itemContent.setText(bean.itemContent);
// long end = System.nanoTime();
// long dValue = end - start;
// 输出每次getView消耗的时间和
// Log.d("xys", String.valueOf(mSumTime));
// return convertView;
// 普通式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>19271161
// 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 获取纳秒时间 更加精确
// long start = System.nanoTime();
// ViewHolder holder = null;
// if (convertView == null) {
// holder = new ViewHolder();
// 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
// convertView = mLayoutInflater.inflate(R.layout.item, null);
// holder.img = (ImageView) convertView.findViewById(R.id.iv_image);
// holder.title = (TextView) convertView.findViewById(R.id.tv_title);
// holder.content = (TextView) convertView.findViewById(R.id.tv_content);
// convertView.setTag(holder);
// } else {
// holder = (ViewHolder) convertView.getTag();
// }
// 取出bean对象
// ItemBean bean = mDataList.get(position);
// 设置控件的数据
// holder.img.setImageResource(bean.itemImageResid);
// holder.title.setText(bean.itemTitle);
// holder.content.setText(bean.itemContent);
// long end = System.nanoTime();
// long dValue = end - start;
// mSumTime += dValue;
// 输出每次getView消耗的时间和
// Log.d("xys", String.valueOf(mSumTime));
// return convertView;
// 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>16325820
} // ViewHolder用于缓存控件
class ViewHolder{
public ImageView img;
public TextView title;
public TextView content;
}
}
Android——Adapter的更多相关文章
- Android进阶(十四)Android Adapter详解
Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...
- [转]Android Adapter以及getView()方法的理解
Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些gett ...
- Android Adapter基本理解
感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...
- Android adapter适配器的学习
学习Android有一点时间,说说自己的学习感悟. 首先呢,先说说适配器的作用,顾名思义,它就是把数据定义好一定的规则,使得我们可以用到ListView GridView等上面 所以说这玩意,还是得好 ...
- 转载《Android Adapter简单总结》
1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid View)等地方都需要用到Adapter.如下 ...
- Android -- Adapter
体系 public interface Adapter----0层(表示继承体系中的层次) public interface ExpandableListAdapter---(无所谓层次因为没有其他 ...
- Android adapter适配器的使用
说起Adapter的使用,首先想到的就是listview或各种各样的Adapter.下面我们对常用的一些Adapter进行简单的使用讲解. 这是Adapter的关系图: 下面的所有例子均使用同一个布局 ...
- android adapter的性能小结
一般adapter的做法会重写getView方法 比如 @Override public View getView(int position, View convertView, ViewGroup ...
- Android Adapter推荐写法
package jason.fragmentdemo.adapter; import nqy.fragmentdemo.R; import nqy.fragmentdemo.model.Article ...
随机推荐
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- HttpClient相关
HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- Xcode7使用插件的简单方法&&以及怎样下载到更早版本的Xcode
Xcode7自2015年9上架以来也有段时间了, 使用Xcode7以及Xcode7.1\Xcode7.2的小伙伴会发现像VVDocumenter-Xcode\KSImageNamed-Xcode\HO ...
- java中使用javamail发送邮件
1. 电子邮件协议 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP. 其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMT ...
- 由用友NC刷新功能得到启示
在做NC刷新界面数据的功能,就是 点刷新按钮然后刷新当前 list 中的数据,犯了一个错误. 我之前的做法是记录每次查询数据的sql条件语句,然后在点刷新的时候去调用这个条件语句,哈哈,错误就在这个逻 ...
- 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令
2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...
- redis持久化RDB和AOF
Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...
- 鸟哥私房菜学习(一)——Linux背景了解
1.Linux,继承鱼Unix 2.Unix档案系统的两个重要概念 3.几个主要的 Linux distributions 发行者网址: • Red Hat: http://www.redhat.co ...
- SqlServer SET IDENTITY_INSERT ON | OFF
想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 示例: 1.首先建立一个有标识列的表: )) 2.尝试在表中做以下操作: , 'gar ...