大家好,又见面了,我是你们的朋友全栈君。
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联系起来。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130642.html原文链接:https://javaforall.cn