Adapter
- Adapter从字面意思了解就是适配器,类似于iOS中UITableView和UICollectionView中的数据源。
对于列表和九宫格控件,安卓也有类似iOS的ListView和GridView。
由于ListView和GridView都继承于抽象类AbsListView,这个类中有一个setAdapter
的方法,通过这个方法可以设置具体需要展示的数据。
1 | 以listView为例: |
与iOS中遵守数据源协议,实现数据源方法类似。
不过在iOS中对于列表和九宫格控件有着各自的数据源协议和函数,而安卓平台上把这个进行了解耦,通过对象的形式一个Adapter可以添加到多个控件,控件则进行样式的展示而已。
ArrayAdapter
- 官方提供了基于
BaseAdapter
的ArrayAdapter
,ArrayAdapter
可以看出采用泛型操作(数组、集合等),文档也说明,在默认情况下提供单个TextView操作,所以如果出现单个文本的情况还是可以采用的。 - 源码已经看出提供单个TextView进行赋值。
1 | private @NonNull View createViewFromResource(@NonNull LayoutInflater inflater, int position, |
- Layout样式:
simple_list_item_1
纯文本
simple_expandable_list_item_1
纯文本“膨胀”版
simple_list_item_checked
文本后加对号选项
simple_list_item_single_choice
文本后加圆形选项
simple_list_item_multiple_choice
文本后加方块选项
等
- 代码实现:
1 | strArr = new ArrayList<>(); |
SimpleAdapter
SimpleAdapter
也是基于BaseAdapter
的,相比ArrayAdapter
增加了ImageView,同时layout样式是可以自己设定的,如果只是简单的图片和文字可以使用SimpleAdapter
。之前在思考为什么只有文字和图片,通过源码可以看出,再给每个item赋值的时候分别判断TextView和ImageView的实例存在。
1 | private void bindView(int position, View view) { |
- 判断实例完再给文本和图片设置值。
1 | public void setViewText(TextView v, String text) { |
- 代码:
1 | List<Map<String,Object>> listItems = new ArrayList<>(); |
- layout: 通过ConstraintLayout来进行布局。
1 | <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" |
BaseAdapter
通过Adapter继承结构图可以看到,Adapter为一个抽象接口,基于这个抽象接口的有一个抽象实现类
BaseAdapter
.对于
BaseAdapter
,在实际开发过程中,大多数都会继承这个类,并重写其方法,定制自己的Adapter,其高度的解耦性,这点和iOS有所不同。相对来讲
SimpleAdapter
和ArrayAdapter
用的少,都是自己重写或者使用第三方Adapter。
源码:https://github.com/RamboLouis/AndroidTestProject/tree/master/AndroidAdapter