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 ...
随机推荐
- php实现设计模式之 状态模式
<?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...
- JDBC关于时间的存取
Oracle数据库默认时间存储是java.sql.date,而java程序中的时间默认是java.util.date,所以通过JDBC存取的 时候会涉及到时间的转换问题. 1.日期存取 存入数据库的时 ...
- 《JS实现复制内容到剪贴板功能,可兼容所有PC浏览器,不兼容手机端》
前记:本来原生的JS是有提供一个函数来实现这个功能(window.clipboardData),但是很遗憾,这个函数仅仅支持IE和FF浏览器,所以基本用处不大.下边介绍的是一个第三方插件库(ZeroC ...
- string.empty , "" , null 以及性能的比较
一:这种结论,个人觉得仍然存疑 http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html 1.null null 关 ...
- Canvas设置width与height 的问题!
最近因为工作需要,所以就学了一下Html中的Canvas标签. 当我看了一下教程后,自己写了一个hello world的时候,麻烦事就出现了.看下面代码: <!DOCTYPE html> ...
- 【代码笔记】iOS-账号,密码记住
一,效果图. 二,工程图. 三,代码. RegisViewController.h #import <UIKit/UIKit.h> @interface RegisViewControll ...
- iOS网络2——NSURLSession使用详解
原文在此 一.整体介绍 NSURLSession在2013年随着iOS7的发布一起面世,苹果对它的定位是作为NSURLConnection的替代者,然后逐步将NSURLConnection退出历史舞台 ...
- 【转】最流行的编程语言JavaScript能做什么?
本文转自互联网! 首先很遗憾的一点是,“PHP虽然是最好的语言”,但是它不是最流行的语言. 对不起的还有刚刚在4月TIOBE编程语言排行榜上榜的各个语言: 你们都很棒,但是你们都担当不了这个大任. 开 ...
- nodejs安装和环境部署
windows 下: 1. 下载windows平台nodejs环境安装包,百度一下nodejs官网,找到DOWNLOADS点击,找到Windows Installer 如果为64位电脑可以选择64位版 ...
- redis数据结构存储Linked List设计细节(redis的设计与实现笔记)
redis里拥有一个灵活扩展且获取表头表尾复杂度为O(1)的双端列表,分为list和listNode2部分组成. list: typedef struct list {//链表 listNode *h ...