关于adapter的理解
在我们平常写布局的时候会想要在布局的中动态加入自己的需要的数据和布局,而适配器就可以帮我们完成这项工作,目前来说系统提供的是两种适配器,一种为ArrayAdapter,而另一种为SimpleAdapter。最后一种则为自定义的适配器,也是最好用的是适配器,接下来我将为这三种适配器来进行简单的说明。
第一种ArrayAdapter适配器可以动态向view里加入文本,是最初接触的,也是上手最快的适配器,但局限性非常高,因为它只能添加文本,但往往满足不了我们的需求,在ArrayAdapter中一般需要Context,Resource,View等参数来向适配器中加入控件和布局,但局限性非常高。
此时则用到了第二种SimpleAdapter的适配器,这种适配器则可以吧图片和文字一起加入,这样的话就大大的提升了适配器的利用性,在SimpleAdapter中我们需要加入Context,需要添加的集合(集合中保存着一个双列集合,分别放在对应的键和控件),需要添加的控件的xml文件,一个字符串数组(双列集合的对应的值),一个整形数组(双列集合对应的资源的值),这样的话我们就可以向View中的每一个Item一次性添加对应的所有的控件和布局,这样就大大的提高了适配器的使用范围。
但对于经常喜欢把常用的方法写成自己的专属的方法的程序猿来说,当然喜欢自己定义一个适配器,于是,自定义适配器就诞生了。
在自定义适配器中,新建一个类去继承BaseAdapter,在父类BaseAdapter中需要实现4个方法
class myAdapterextends BaseAdapter{
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
}
在如上所示的4个方法中最重要的则是getView的方法,因为它会为我们解决所有关于布局和控件的排版,接下来我将为大家一一讲解
在第一个getCount方法中,这个方法是获取被传进来的集合的长度,所以我们一般会让它返回传进来的数组的长度
public int getCount() {
return list.size();
}
在第二个getItem方法中,这个方法是获取被传进来的集合的内容,关于这个内容,我们一般会把我们需要放的一整个布局的所有控件做成一个双列集合(HashMap),下面我会进行详细说明;方法中传进来的position则是当前为第几个Item,所以我们一般会让它返回传进来的集合的每一个Item
public ObjectgetItem(int position) {
return list.get(position);
}
在第三个getItemId方法中,这个方法获取被传进来的集合的当前下标,和上面说的position其实是一个作用,所以直接返回position即可
public long getItemId(int position) {
return position;
}
在说第四个方法前我们先说说在使用自定义adapter需要准备的工作,我们在上面提到adapter会接收一个集合,那么,我们需要准备一个集合的接收器,当然,你也可以把它设置成一个参数传进来
public void setList(List<Map<String,Object>> list) {
this.list = list;
}
我们还需要准备一个反射器用来接收Context,即布局与java文件的交互过程,也就是获取被添加控件的布局,只不过以Context的方式可以在java文件中进行操作,并且,这个方法最好写在构造函数中
public MyAdapter(Context context) {
this.inflater = LayoutInflater.from(context);
}
当上面的准备工作都做完后,我们就可以开始来进行我们自定义适配器最重要的一部分,即重写getView方法
在getView的方法中,返回的是View参数,那么可以直接理解为返回的是需要被添加的VIew的一个完整的布局,所以我们需要先使用反射器来获取
需要加入的布局,
view =inflater.inflate(R.layout.main_item,null);
这样就可以对我们需要添加的布局进行操作了
而接下来的内容就视个人而定了,这里我就简单的对控件进行一个设置文本的行为
public ViewgetView(int position, View convertView, ViewGroup parent) {
view =inflater.inflate(R.layout.main_item,null);
findView();
map =list.get(position);
control_doing();
return view;
}
public void findView(){
Main_item_tv1 =view.findViewById(R.id.Main_item_tv1);
}
public void control_doing(){
//map中为我提前添加的数据
Main_item_tv1.setText(map.get("test");
}
}
这样我们就完成了一个自定义适配器的建立,我对自定义适配器的理解其实就是把自己想做的事情放到适配器里,大大的减少了主函数代码中的内容量,把重复的工作给不断的缩短,以达到目的。