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 ...
随机推荐
- Delphi_05_Delphi_Object_Pascal_基本语法_03
继续Delphi的学习之旅, 废话不多说,直接贴代码. { Delphi基本语法 1.对象 2.指针 3.类型别名 和 类型转换 } program DelphiObject; {$APPTYPE C ...
- Java内部类学习笔记
20160923 定义:将一个类的定义放在另一个类的内部: 从外部类的非静态方法之外,创建某个内部类的对象:OutClassName.InnerClassName: 内部类拥有所有其外部类的成员的访问 ...
- Hibernate(二)__简单实例入门
首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...
- iOS角度与弧度转换
在iOS中图片的旋转单位为弧度而不是角度,所以经常会在两者之间进行转换 弧度转角度 #define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / ...
- Android Studio使用时源码到处报红色警告,运行时又没错
转载地址:http://www.07net01.com/program/2016/04/1452749.html [摘要:正在AS上开辟时,碰到那个题目,翻开全部的Java源文件,右边一起标赤色,找没 ...
- http参数的封装(后台接受参数的场景)
场景 不管是任何web框架作为一个web的开发人员必须要搞明白control层如何接受各种参数. 下面就根据我们公司的系统架构(nutz)来进行一下场景描述.各位小伙伴也可以根据这些 场景自己去总结一 ...
- overflow:hidden与margin:0 auto之间的冲突
相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.
- 给Eclipse提速的7个技巧
这篇文章只是关注如何让Eclipse运行得更快.每个技巧都针对Windows.Linux和MacOS用户详细说明.在使用所有优化技巧之后,Eclipse应该能在10秒内启动,并且比以前运行得更流畅. ...
- 初识WebService
一.什么是Web服务 Web服务是一种可以用来解决跨网络应用集成问题的开发模式,目的是保证不同平台的应用服务可以互操作 二.Web服务的三个核心 Soap: SOAP(Simple Object Ac ...
- UNITY和图片像素的换算
https://zhidao.baidu.com/question/143233873.html 1米X1米换算成像素是2835X2835的