Adapter是AdapterView视图与数据之间的桥梁,Adapter提供对数据的访问,也负责为每一项数据产生一个对应的View。其作用如下图所示:

Adapter的继承结构

 
其中详细的讲解了一个自定义BaseAdapter的demo,对于getView方法解解释比较好。
其实param2 converView就是一个带返回的现实在列表中的一个item,而这个view,可以是一个view的tag,其中可以封装一组组件,比如使用一个自定义的:
public final class ViewHolder{
public ImageView img;
public TextView title;
public TextView info;
public Button viewBtn;
}
将对应的item.xml中的各个组件设置成字段,之后再将该字段封装到getView需要返回的view中,作为其的一个tag,而且在这里需要注意的是,只需要在getView中对其设定一次:
@Override
public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder=new ViewHolder();  convertView = mInflater.inflate(R.layout.vlist2, null);holder.img = (ImageView)convertView.findViewById(R.id.img);holder.title = (TextView)convertView.findViewById(R.id.title);holder.info = (TextView)convertView.findViewById(R.id.info);holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);convertView.setTag(holder);}else {holder = (ViewHolder)convertView.getTag();}
}

  之后我们就可以按照业务需求,自己设定各个组件的各种属性了,就可以动态的对List中的各个空间进行动态的数据绑定。这也是我现在在做的一个项目需要达成的目的,也就是根据读取一个xml文件里面定义了一组用于构建不同的button的信息,他们获取具有不同的style和单击处理业务,这就需要我们来执行定义一个adapter,进行数据的适配,之前我的想法是沿用simpladapter之后,用一个自定义类去继承他,在他的getView中,将父类适配好的button再取出来进行样式等的设置,这也是一个思路吧。
public class ListViewAdapter extends BaseAdapter {private List<String> items;private LayoutInflater inflater;public ListViewAdapter(Context context, List<String> items) {this.items = items;inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

一个自定义adapter的damo:
/*** @author allin**/
public class MyListView4 extends ListActivity {private List<Map<String, Object>> mData;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mData = getData();MyAdapter adapter = new MyAdapter(this);setListAdapter(adapter);}private List<Map<String, Object>> getData() {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();Map<String, Object> map = new HashMap<String, Object>();map.put("title", "G1");map.put("info", "google 1");map.put("img", R.drawable.i1);list.add(map);map = new HashMap<String, Object>();map.put("title", "G2");map.put("info", "google 2");map.put("img", R.drawable.i2);list.add(map);map = new HashMap<String, Object>();map.put("title", "G3");map.put("info", "google 3");map.put("img", R.drawable.i3);list.add(map);return list;}// ListView 中某项被选中后的逻辑@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {Log.v("MyListView4-click", (String)mData.get(position).get("title"));}/*** listview中点击按键弹出对话框*/public void showInfo(){new AlertDialog.Builder(this).setTitle("我的listview").setMessage("介绍...").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}public final class ViewHolder{public ImageView img;public TextView title;public TextView info;public Button viewBtn;}public class MyAdapter extends BaseAdapter{private LayoutInflater mInflater;public MyAdapter(Context context){this.mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder=new ViewHolder();convertView = mInflater.inflate(R.layout.vlist2, null);holder.img = (ImageView)convertView.findViewById(R.id.img);holder.title = (TextView)convertView.findViewById(R.id.title);holder.info = (TextView)convertView.findViewById(R.id.info);holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);convertView.setTag(holder);}else {holder = (ViewHolder)convertView.getTag();}holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));holder.title.setText((String)mData.get(position).get("title"));holder.info.setText((String)mData.get(position).get("info"));holder.viewBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showInfo();}});return convertView;}}
}convertView个人理解:比如一个屏幕能显示7条数据,convertView则相对于此种数据结构的载体,程序运行时Android调用7次getView()函数来创建承载数据的载体,如下拉显示后面的数据,将不会再创建 直接将数据赋值给前面创建的载体即可。节约内存

有按钮的ListView

  但是有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。效果如下:

程序代码:

  下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

转载于:https://www.cnblogs.com/DswCnblog/archive/2012/11/29/2795355.html

android Adapter相关推荐

  1. Android Adapter适配器

    Android Adapter适配器 Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View. Andr ...

  2. android Adapter使用详解

    将此句说100遍, 你就会用了: 适配器的作用就是将数据绑定到条目界面的每一个显示控件上. ---------------------------------屎一样的分割线-------------- ...

  3. android adapter排序,Android BindingAdapter执行顺序?

    我需要了解数据绑定库如何确定其BindingAdapter的执行顺序.如果我有一个View的两个BindingAdapter,如果View有两个属性对应于那些BindingAdapters,它将如何确 ...

  4. android adapter 按钮隐藏 第一个无效_Android开发规范

    注释 类/复杂或者不能从方法名字看出意图的方法必须添加注释 /** * @Author: LiuJinYang * @CreateDate: 2020/5/16 9:32 * 网络请求工具类 */pu ...

  5. android adapter 组件,Android UI - AdapterView 及其子类

    AdapterView AdapterView 是一个抽象类,其派生的子类在用法上十分相似: AdapterView 继承了 ViewGroup: AdapterView 及其子类的继承关系如下: A ...

  6. Android——adapter解读

    文章目录 前言 一.adapter是什么? 二.适配器解读 1.继承 2.对象 3.实现方法 4.实现原理 5 .方法联系 6.创建构造方法 三.总结 前言   本篇文章将以常用的RecyclerVi ...

  7. android adapter点击事件,Activity中响应Adapter的点击回调事件

    假设一个场景,在ListView的Item中,点击"+"按钮加入该item的商品到购物车中.给予的解决方案是: 在Adapter中定义一个回调接口,在Activity中实现该接口, ...

  8. Android Adapter接口的实现类总结

    一.Adapter的理解 (一)基本概念     首先,我们先要了解什么是Adapter,其实我们一般都可以从翻译中知道一点,这个单词的翻译是"适配器".也就是说,我们可以通过Ad ...

  9. Android - Adapter 适配器

    Android 适配器 本文介绍两个Adapter: ArrayAdapter:最简单的Adapter,只能展现一行文字. XML文件: <ListViewandroid:id="@+ ...

最新文章

  1. 面试官:说说RabbitMQ 消费端限流、TTL、死信队列
  2. 【TarsosDSP】TarsosDSP 简介 ( TarsosDSP 功能 | 相关链接 | 源码和相关资源收集 | TarsosDSP 示例应用 | TarsosDSP 源码路径解析 )
  3. 深度学习:优化器工厂,各种优化器介绍,numpy实现深度学习(一)
  4. Codeforces Round #192 (Div. 2)
  5. Linux下安装和配置solr/tomcat/IK分词器 详细实例一.
  6. Python中的进程和线程
  7. 如何维持手机电池寿命_手机如何正确充电,电池寿命长。
  8. Kafka 几个实现细节
  9. tablet2+android,z2tablet不开机了 怎么处理,索尼Sony Xperia 安卓平板论坛
  10. 芒果魔兽世界单机没法运行服务器,大芒果魔兽世界单机版局域网联机方法
  11. pwnable-mistake
  12. MyBatis整合Spring的实现(16)
  13. 机器学习案例:预测自行车流量——基于Scikit-Learn
  14. ubuntu 16.04 桌面版 双击自动删除文字 解决方案
  15. Glib学习(17) Key-value文件解析器 Key-value file parser
  16. 【springcloud】功能尝试(二)熔断器的三个功能
  17. o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task
  18. 如何安装 WordPress 插件?我告诉你2种常用方法
  19. 数字标牌 android,【浩鑫推出全球首款英特尔方案+Android系统数字标牌播放器】PjTime.COM 新品快讯 Intel...
  20. 计算机休眠快捷键设置在哪里设置,电脑待机快捷键【设置法子】

热门文章

  1. 自动驾驶高峰激辩:寒冬还有多远,芯片路线之争,人才缺乏待解
  2. SAP WMS Posts
  3. SAP实施项目中采购员在非生产性采购申请审批流中的角色安排
  4. 多项式概率分布(Multinomial probability distribution)和分类分布(categorical distribution)
  5. 拒绝赛博朋克:斯坦福HAI报告警示“科技巨头垄断AI研究已成威胁”,力挺「国家安全云」计划...
  6. Forerunner:首个面向“多未来”的推测执行技术
  7. 多角度回顾因果推断的模型方法
  8. 美军重视扩展现实技术的研究和应用
  9. Java 全能手册火了!Redis/Nginx/Dubbo/Spring 全家桶/啥都有
  10. 一男子蒙冤入狱 10 天,竟是 AI 认错了!