创建一个自定义的适配器需要继承BaseAdapter,并常常需要写以下几种方法:
1、构造函数
2、getCount(int position)
3、getItem(int position)
4、getItemId(int position)
5、getView(int position, View convertView, ViewGroup parent)
其中各方法的作用为:
1.构造函数用来向每一项的数据赋值。
2.getCount(int position)方法用来获取适配器表示的数据集中有多少项,返回项数;
3.getItem(int position)方法用来获取数据集中特定位置的数据项,返回特定位置中的数据;
4.getItemId(int position)方法用来用来获取与列表中指定位置关联的行ID,返回指定项位置的Id;
5.getView(int position, View convertView, ViewGroup parent)方法用来获取在数据集中指定位置显示数据的视图。可以手动创建视图,也可以从 XML 布局文件中加载它。当加载视图时,父视图(GridView、ListView…)将应用默认布局参数,除非您使用inflate(int, android.view.ViewGroup, boolean)来指定根视图并防止附加到根视图,返回与指定位置的数据对应的视图。
在具体写的时候,用接收到的数据为每一项赋值来进行构造;用size()方法返回泛型集合中的元素个数实现getCount()方法的功能;用get()方法获取集合中的个体实现getItem()方法的功能;用get()和getId()方法获取当前位置项的Id,实现getItemId()方法的功能。前面几个函数的功能都较为简单,可以一笔带过,而getView()方法的实现较为复杂,需要详细讨论。
要想知道如何写getView()方法,首先我们要知道getView(int position,View convertView,ViewGroup parent)三个参数的含义:
position: 我们想要视图的项在适配器的数据集中的位置。
convertView:如果可能,要重用的旧视图。注意:在使用之前,应检查此视图是否为非空视图和适当类型。如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。异构列表可以指定其视图类型的数量,以便此视图始终为正确的类型(详见getViewTypeCount()和getItemViewTyp e(int))。
parent: 此视图最终将附加到的父级。
知道了三个参数的含义之后,我们开始着手写getView()方法。
首先需要指定视图,一般用View.inflate()或LayoutInflater.inflate()方法加载视图,写法示例如下:
//View.inflate()写法
View view = View.inflate(this, R.layout.item, null);
//LayoutInflater.inflate()写法
View view = LayoutInflater.from(this).Inflate(R.layout.item, false);
其中,this表示上下文,R.layout.item表示索要加载的布局。
View.inflate()的最后一项参数表示resource生成view对象要填入的父布局,为null,则返回resource生成view对象,否则将view填入到root中,以root作为根布局返回;
LayoutInflater.inflate()的最后一项参数表示是否将resource生成view对象填入root,以root作为最终返回view的根布局。 false,root不为null,则提供root的LayoutParams约束resource生成的view;true,root不为null,以root作为最终返回view的根布局。
加载布局完成后,我们通过findViewById()方法获取到在布局文件中定义的元素并对获取的元素进行一系列设置,最后返回加载了视图的view,getView()方法的功能就算实现了。