Android 5.1 Contacts源码分析(四):Contacts模块ListView Adapter结构

1. Contacts模块列表界面Adapter结构:

下图是联系人模块列表窗口对应的Adapter类图:

从上一篇文章Contacts模块Fragment结构中已知,联系人列表界面中的ListView的Adapter大部分继承自 ContactEntryListAdapter。
而从该类图中可知:
ContactEntryListAdapter最终继承自CompositeCursorAdapter并实现了PinnedHeaderListView.PinnedHeaderAdapter接口,也就是说界面中的ListView均为自定义的PinnedHeaderListView,例如在原生的Contacts主界面中,会根据联系人拼音的首字母分类,并显示在每个分类的第一个Item上(A,B,C…Z)。在ContactEntryListAdapter的父类IndexerListAdapter中有一个SectionIndexer(ContactsSectionIndexer) mIndexer成员变量,从源码中可以知道该类是用来管理联系人的每一个分类标签(A,B,C…Z)显示在ListView的哪个位置的。

public ContactsSectionIndexer(String[] sections, int[] counts) {
    …...
    this.mSections = sections;
    mPositions = new int[counts.length];
    int position = 0;
    for (int i = 0; i < counts.length; i++) {
        …...
        mPositions[i] = position;
        position += counts[i];
    }
    mCount = position;
}

在ContactEntryListAdapter的newView中会创建一个ContactListItemView对象,在该类中动态绘制每一个联系人的头像,姓名,号码等信息,该类将会在后续内容中详细说明。

@Override
protected ContactListItemView newView(...) {
    final ContactListItemView view = new ContactListItemView(context, null);
    …...
}

与Fragment类似,DefaultContactListAdapter:为联系人主界面PeopleActivity中DefaultContactBrowseListFragment的ListView的adapter;
其余的则跟联系人多选择界面有关。

很多优秀的第三方rom中,联系人模块的列表界面很统一,美观,其实个人觉得这应该归功于google的软件工程师们,他们的设计使得我们在二次开发时,只需要做少量的修改,就可以做出统一的效果了,至此,对Contacts模块的UI组成结构已经有了一个整体的认识,在接下来的文章中,我会详细介绍每个界面具体是如何实现的。

你可能感兴趣的:(源码,android,ListView,Adapter,Contacts)