Android Adapter适配器

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

Android中有很多的适配器,首先看看这些适配器的继承结构

Data、Adapter、View三者的关系
  
Data、Adapter、View三者的关系

一个listAdapter用来管理一个用一组任意对象的数组填充的ListView。
ListAdapter列表项的显示配置:
一、 通过简单XML文件配置
默认的ListAdapter希望提供的ListView每一项的 xml布局配置文件中只有一个TextView。
构造函数:public ArrayAdapter (Context context, int textViewResourceId)
  context: 当前的上下文对象
  textViewResourceId: The resource ID for a layout file containing a TextView to use when instantiating views. 一个包含了TextView的布局xml文件的id,注意(这个布局文件里只能有TextView一个控件,TextView不能有父控件,否则会报错 java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView)
  类似于这种的xml
  <?xml version="1.0" encoding="utf-8"?>
  <TextView android:id="@+id/subject"
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:layout_marginTop="5dip" android:textAppearance="?android:attr/textAppearanceMedium"
   android:singleLine="true" android:ellipsize="end" />
 public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
  objects:用来填充ListView,给ArrayAdapter提供数据的数组
public ArrayAdapter (Context context, int textViewResourceId, List<T> objects) 
//建议使用这个,直接给ArrayAdapter填充了数据
二、 复合布局文件XML配置
如果你想使用一个复合布局的话,你就要使用含有id字段的构造函数了,这个id要去引用这个复杂布局文件 中的一个TextView,TextView被引用了,使用数组中的对象,调用toString方法,转换成字符串来填充这个TextView,你可以使 用包含自定义对象的数组或者集合。重写自定义对象的toString()方法,来保证ListView显示。
public ArrayAdapter (Context context, int resource, int textViewResourceId)
这个是用来复杂布局的,ListView的Item项的布局文件中不止含有一个TextView控件
  resource: The resource ID for a layout file containing a layout to use when instantiating views. ListView中Item项的复杂布局xml文件
  textViewResourceId:The id of the TextView within the layout resource to be populated(显示) ListView中Item项的复杂布局xml文件中用来显示ArrayAdapter中数据的那个TextView
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)
public ArrayAdapter (Context context, int resource, int textViewResourceId, List<T> objects)
//建议使用这个,直接给ArrayAdapter填充了数据。
  方法:
  这个方法能够使用数组xml文件中配置的数据来创建一个ArrayAdapter,这个数组中的内容如何获得,通过this.getResources().getTextArray(id)方法获得。
  自定义数组xml文件的标识id号,也就是ArrayAdapter要绑定到ListVIew中的数据
textViewResourceId:用于显示数组数据的布局文件的id标识号(注意:该布局文件中只能有一个TextView,有多个就会报错,一般是 ClassCastException)
三、 通过重写Adapter的getView方法来得到你想要的view。
你也可以是使用其他的一些非TextView 控件来显示数组中的数据,通过重写Adapter的getView方法来得到你想要的view。
public View getView(int position, View convertView, ViewGroup parent) { 
ViewHolder holder; 
if (convertView == null) { 
convertView = mInflater.inflate(R.layout.list_item_icon_text, null); 
holder = new ViewHolder(); 
holder.text = (TextView) convertView.findViewById(R.id.text); 
holder.icon = (ImageView) convertView.findViewById(R.id.icon); 
convertView.setTag(holder); 
} else { 
holder = (ViewHolder) convertView.getTag(); 

holder.text.setText(DATA[position]); 
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); 
return convertView; 
}

static class ViewHolder { 
TextView text; 
ImageView icon; 
}

BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性
构造一个Adapter:
public class xxxxAdapter extends BaseAdapter {

private Context context; 
private List<xxxx> xxxxList;

public xxxxAdapter(Context context, List<xxxx> weatherList ) { 
this.context = context; 
this.xxxxrList = xxxxList; 

//1.先判断adapter 有多少数据项,根据这个数据确定有多少item.
public int getCount() { 
return xxxxList!=null? xxxxList.size() :0; 
}

public Object getItem(int position) { 
return xxxxList.get(position); 
}

public long getItemId(int position) { 
return position; 

//2 确定每个item里加载哪个View
public View getView(int position, View convertView, ViewGroup parent) { 
参考上面
}

}

最近做个项目,要用到异步加载,动态刷新UI等。看了下2.2系统的图库源码,感觉写的不错。同时又把ListView拿出来研究了下,做个笔记。

先上图:

1. Android中大量用到了适配器模式,比如ListView、GridView等。

所谓的适配器模式,我的理解是类似电源适配器或者转接头之类的转换器。

电源适配器将不适合机器工作的电压输出为机器适合的电压。转接头就更好理解了,将不配套的插头和插座连接在一起。适配器模式跟这个类似,将两个不相干的类作用在一起,使它们能配套适用。



Android里面的适配器结构基本如上图所示。还有其他的各种适配器类如SimpleAdapter,SimpleCursorAdapter等都是直接或间接地继承BaseAdapter。我们自定义ListView时所用到的Adapter同样要继承BaseAdapter必须实现几个方法:getCount(),getItem(int position),getItemId(int position),getView(int position, View convertView, ViewGroupparent)

为什么会这样呢?

注意到Spinnerdapter和ListAdapter都是接口,它们继承了Adapter接口。而BaseAdapter是一个抽象类,它实现上述两个接口,但它并没有实现上面提到的那四个方法。所以构建BaseAdapter的子类时必须要实现那四个没有实现的四个接口方法。其实在Android中有很多这样的例子,在继承某个类时会默认让你Override一些方法,这些方法就是父类中没有实现的接口方法。

重写了这四个方法后适配器才能够和控件合作,将数据和控件UI联系起来。

Android适配器作用相关推荐

  1. android的适配器作用,适配器在Android中的作用是什么?

    适配器在Android中的作用是什么? 我想知道在Android环境中何时,何地以及如何使用适配器. 来自Android开发者文档的信息对我来说不够,我希望得到更详细的分析. 11个解决方案 39 v ...

  2. Android JNI作用及其详解

    Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 J ...

  3. android适配器SimpleAdapter实现效果

     android适配器SimpleAdapter实现效果 四种适配器 ListAdapter BaseAdapter ArrayAdpter SimpleAdapter 在安卓开发中,Adaper适配 ...

  4. Android适配器以及作用,Android RecyclerView 通用适配器的实现

    分析 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并 ...

  5. Android适配器以及作用,Android Studio:自定义Adapter(适配器)的一些通俗易懂的理解(以一个简单的聊天界面为例)...

    本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习. 第一  先来看看实现这个程序需要需要创建哪 ...

  6. android的适配器作用,适配器模式安卓中的应用

    安卓里面经常用到的控件Recycleview和ListView我们经常会写adapter,很直观,就是适配器的意思,关于适配器简单的例子很多,这里晚上找到的随便给一个,例子来源于这篇文章 160117 ...

  7. Android: 适配器中的 viewholder 的作用

    首先我们使用ViewHolder 就是为了在RecyclerView 滚动时设置值的 在我们使用ListView或者RecyclerView时, 当有大量的数据需要加载的时候,会占据大量内存,影响性能 ...

  8. android zxing作用,Android / ZXing不再有效

    我的应用程序使用ZXing帮助程序类IntentIntegrator和IntentResult来使用ZXing条形码扫描程序. 现在我发现ZXing不再提交扫描结果,相关的返回值为空/空. 因此,我更 ...

  9. android handler作用,Android中Handler的作用

    * Handler的定义: * 主要接受子线程发送的数据, 并用此数据配合主线程更新UI.当应用程序启动时, * Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控 ...

最新文章

  1. Knapsack Cryptosystem(2019牛客多校折半查询)
  2. c++ 多核cpu序列号_关于 CPU 的一些基本知识总结
  3. docker -v -it -p 详细说明
  4. 归心似箭,IT达人分享抢票攻略
  5. Error mounting /dev/sdc1 at /media/XXXX: Command-line `mount -t “ntfs“ -o
  6. 计算机磁盘坏道怎么隔离,小科普 | 硬盘坏道就凉凉?把它隔离出去吧!(DLC)...
  7. 统信操作系统 摄像头驱动程序
  8. matlab 呼吸灯,一种控制呼吸灯呼吸效果的方法与流程
  9. 重新认识Git——抽丝剥茧说Git
  10. 最新的 iOS 申请证书与发布流程 2016
  11. 支付宝快捷支付服务 android,图文详解Android下支付宝快捷支付教程
  12. IE不能上网浏览的问题
  13. matlab画出二维可行域,matlab中如何对线性规划不等式画图,以及标出可行域?
  14. redis数据类型及常用数据操作
  15. 个人简历网页搭建(快速搭建GitHub Pages和Apache)
  16. python查找文件并重命名_python复制文件并重命名
  17. python空气质量指数计算_空气质量指数数据分析可视化
  18. 只谈链不谈币,区块链会发展成什么样的方向?
  19. Java构造器设置颜色_ICC_ColorSpace
  20. 为什么偏偏是 1024 ?

热门文章

  1. TP-LINK如何设置Wifi无线上网短信认证?
  2. java中jframe是什么_java中JFrame是什么
  3. 微信小程序选项卡swiper默认高度150px(让高度实现自适应)怎么解决?
  4. x~N(0,4),F(x)为其分布函数,则F(x)
  5. MIZ7035上的AXI接口的MIG测试
  6. CO2/MAG/MIG焊接机(碳钢和不锈钢脉冲)
  7. php 小偷程序 图片,一个图片地址分解程序(用于PHP小偷程序)
  8. IBM要做挑茶AI,茶叶小妹都乐疯了
  9. 看了个文章,说7z压缩文件损坏后无法恢复。建议使用zip/rar格式
  10. 新浪财经沪深300指数期权和商品期权行情接口