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 ...
随机推荐
- 同步辅助类CountDownLatch用法
CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则使当前线程处于等待状态,调用countDow ...
- Java名字的由来
Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果. Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序,如: ...
- Windows消息机制
Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...
- JqueryDataTable的使用(.Net平台)
上一篇随笔提到了MvcPager,最近用到了一款前端JQ插件------DataTable(简称DT),很好用. DT是一款前端插件,和后端完全分离开,就这点来看,我就特别喜欢. 一.使用DT,需要以 ...
- 微软要如何击败Salesforce?Office365、Azure、Dynamics365 全面布局AI | 双语
微软在上月宣布组建自己的 AI 研究小组.该小组汇集了超过 5000 名计算机科学家和工程师,加上微软内部研究部门,将共同挖掘 AI 技术. 与此同时,亚马逊,Facebook,Google,IBM ...
- [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...
- Android之RecyclerView的原生Bug-Inconsistency detected. Invalid view holder adapter positionViewHolder{a1bbfa3 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}
今天在运行自己编写的App时,突然发现App在运行时闪退,然后就查看了Android Studio的Log,发现了这个错误,上网查了一下,才知道是RecyclerView的原生Bug,在数据更新时会出 ...
- Android APP 简单高效的禁用横竖屏切换
默认情况下,Android APP的界面会随着手机方向的改变而改变,当手机处于竖屏状态,APP的界面也处于竖屏状态,而当手机处于横屏状态,APP也会自动切换到横屏状态.一般情况下APP的界面都是为竖屏 ...
- JCIP chap3 share objects
"同步"确保了操作的原子性执行,但它还有其它重要的方面:memory visibility.我们不但要确保当一个线程在使用一个对象的时候,其它线程不能修改这个对象,而且还要保证该线 ...
- 运行python程序
1 在windows下运行python程序 1)从DOS命令行运行python脚本 用python解释器来执行python脚本,在windows下面python解释器是python.exe,我的pyt ...