还记得我们之前说的ListView吗,(这个难用的控件-。+)我们在用他的同时也用到了一个叫做适配器Adapter的东西。一般我们用一个类继承BaseAdapter,来进行数据和控件的适配。
但是我们每一种适配器都只是为了适配一种数据源和一种布局,如果用到的少还好,如果要用到十几种,我们是不是要写十几个适配器呢?这个想法真的是太蠢了!
有一种适配器写法,可以做到一个适配器与多种类型数据和布局进行适配,这个东西叫做通用适配器(因为他是用到泛型实现的,我称他为泛型适配器),今天我们来看一下这种适配器的写法:
在写之前呢,我们首先回忆一下之前所用到的BaseAdapter适配器:
我们通过继承BaseAdapter,实现了他的四个方法:getCount,getPosition,getItem,和getView。其中最难写的就是getView了,
然后我们还对他进行了优化:通过写一个叫做ViewHolder的类,在里面放入对应的控件。
现在我们首先来说一下通用适配器和一般的适配器的区别和相同点:
普通适配器构造方法中传递上下文和源数据 | 通用适配器中传递条目的布局id和源数据 |
普通适配器的ViewHolder为成员变量 | 通用适配器ViewHolder一般写成单例模式 |
普通适配器在getView中将数据、控件、布局写死 | 通用适配器在getView中调用实现的抽象方法,以回调的方式实现多类型适配 |
接下来我们正式来看一下通用适配器的写法:
1.先创建好我们今天需要的控件、源数据以及Bean类。
控件只有一个ListView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activities.MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/mlv"/> </LinearLayout>beans方法模拟了一个假数据
private void beans() { list = new ArrayList<>(); for (int i = 0; i < 16; i += 4) { list.add(new Student("同学" + i, "男", 15 + i, R.drawable.a, true)); list.add(new Student("同学" + (i + 1), "男", 15 + i, R.drawable.b, false)); list.add(new Student("同学" + (i + 2), "男", 15 + i, R.drawable.c