http://blog.sina.com.cn/s/blog_9f233c070101b3x5.html
看完了拨号盘界面的实现后,大家可能会感觉到,挺简单的,没什么复杂的,只是在onCreateView方法中加载了一个layout,然后就全都看到了,so easy!
那么,我们接下来就分享一下稍微复杂一点的CallLog界面,希望大家看完后,依然会如此说!
在DialtactsActivity中通话记录对应的Fragment为CallLogFragment
下面我们先来看看通话记录的默认显示,下图1
在Android4.0中Contacts通话记录界面剖析(源码)
图1 通话记录页面
咋一看,该页面分为两部分,tab 的title和list列表页面
Tab的title 就不再复说了,与上文中的拨号界面的实现方式完全相同,现主要描述通话记录的list页面,实际上该页面还会出现通话记录为空的界面等。
通话记录页面的实现
现在我们直接来看onCreateView方法
在该方法第一句
View view = inflater.inflate(R.layout.call_log_fragment, container, false);
跟进call_log_fragment.xml
发现
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="none"
android:scrollbarStyle="outsideOverlay"
android:divider="@null"
/>
估计该listView就是要显示的列表
跟进代码…
奇怪了,CallLogFragment代码中怎么就没有调用list的呢?
如果这条线断了,就不知道往下该咋弄了啊! 急~
原来是这样子的,CallLogFragment继承自ListFragment而在ListFragment中的ensureList方法中进行了初始化,具体的语句如下:
View rawListView = root.findViewById(android.R.id.list);
mList = (ListView)rawListView;
rawListView获得的list的名字是android.R.id.list,而我们的布局文件中list的名字是@android:id/list,没错了吧。
而在我们的CallLogFragment中只要调用getListView即可获得listView了
为了避免您的怀疑,我们在看一下ListFragment的getListView方法:
public ListView getListView() {
ensureList();
return mList;
}
既然找到了list,接下来我们要看看数据的绑定了,
一提到数据的绑定,立即就会想到Adapter,下面我们看看Android源码是怎么写的
在onViewCreated方法中,我发现了如下的几句话
String currentCountryIso = ContactsUtils.getCurrentCountryIso(getActivity());
mAdapter = new CallLogAdapter(getActivity(), this, new ContactInfoHelper(getActivity()
, currentCountryIso), mVoiceMailNumber);
setListAdapter(mAdapter);
第二句创建了一个CallLogAdapter对象,然后调用setListAdapter方法,将CallLogAdapter对象设置过去,
不用说setListAdapter方法肯定是ListFragment的方法,看代码
public void setListAdapter(ListAdapter adapter) {
boolean hadAdapter = mAdapter != null;
mAdapter = adapter;
if (mList != null) {
mList.setAdapter(adapter);
if (!mListShown && !hadAdapter) {
// The list was hidden, and previously didn't have an
// adapter. It is now time to show it.
setListShown(true, getView().getWindowToken() != null);
}
}
}
代码中对我们来说最重要的一句
mList.setAdapter(adapter);
mList对应于我们布局文件中的list,没错了吧,看样一切的秘密都在这个adapter中了,继续跟进adapter
该Adapter怎么会没有getView呢?
我们看CallLogAdapter的父类,GroupingListAdapter,在该方法中有getView方法,
public View getView(int position, View convertView, ViewGroup parent) {
…
if (view == null) {
switch (mPositionMetadata.itemType) {
case ITEM_TYPE_STANDALONE:
view = newStandAloneView(mContext, parent);
break;
case ITEM_TYPE_GROUP_HEADER:
view = newGroupView(mContext, parent);
break;
case ITEM_TYPE_IN_GROUP:
view = newChildView(mContext, parent);
break;
}
}
…
return view;
}
原来是调用了newStandAloneView,newGroupView,newChildView方法,来创建view的
那么我们接下来继续回到CallLogAdapter中查看上述三个方法所加载的布局文件
call_log_list_item.xml
呵呵,一看该布局,不会有错了,就是该list的分项
Ok,简单吧
分享到:
相关推荐
本资源提供的"android4.0 Contacts 联系人jar包"是Android 4.0系统中用于处理联系人功能的核心库,它包含了与联系人相关的API和类,使得开发者能够更加方便地进行联系人应用的开发。 首先,Android 4.0的Contacts ...
Android中的ContentProvider是数据共享的关键组件,Contacts应用通过ContentProvider对外提供联系人数据的增删改查接口。开发者可以通过URI来访问这些接口,实现与其他应用的数据交互。 3. **SQLite数据库** 在...
通过对`PeopleActivity`及其相关组件的源码分析,我们可以深入理解Android 4.0中“Contacts”应用的工作原理。这不仅包括UI布局的设计,还包括Activity生命周期管理、Fragment的使用、事件监听和数据过滤等高级概念...
在Android 4.0中,选择联系人通常通过Intent启动Contacts应用的特定界面。这部分源码展示了如何构建和解析Intent,以及如何在不同的Activity之间进行跳转。 8. **性能优化** Contacts应用在处理大量数据时需要...
在深入探讨安卓Android源码中的Contacts部分之前,我们需要先理解Contacts在安卓系统中的重要地位。Contacts是用户管理个人联系人信息的主要应用,它负责存储、显示和操作联系人的姓名、电话号码、电子邮件地址等...
1. **数据存储**:在Android中,联系人数据主要存储在SQLite数据库中,通过ContentProvider进行访问。Android 4.0的联系人应用会使用多个表来存储姓名、电话号码、电子邮件地址等不同类型的联系人信息。 2. **...
虽然Android 4.0默认未开启通话录音功能,但源代码中包含了相关接口,开发者可以利用这些接口实现通话录音。关键类如`AudioRecord`和`MediaRecorder`用于音频数据的捕获和编码。 7. **电话簿(Contacts)集成** ...
4. **UI组件**:Contacts应用的界面构建基于Android的布局和控件,如`ListView`用于展示联系人列表,`RecyclerView`在新版本中替换`ListView`提供了更好的性能和可定制性。`CursorLoader`用于加载数据库查询结果到UI...
Android应用源码之Contacts.zip项目安卓应用源码下载Android应用源码之Contacts.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
在Android系统中,联系人应用Contacts是用户与设备上的联系信息进行交互的主要界面。源码分析可以帮助我们深入了解其内部工作原理,以及如何自定义或优化这个应用。2013年11月份的Contacts源码提供了对Android 4.x...
在Android系统中,联系人应用(Contacts)是用户与他人通信...通过对Android源码的深入分析,我们可以理解Contacts应用如何高效地管理、显示和操作大量联系人数据,这对于定制化开发或者优化性能有着重要的指导意义。
Android Intent 跳转到系统应用中的拨号界面、联系人界面、短信界面 在 Android 开发中,Intent 是一个非常重要的概念,它允许不同的应用程序之间进行交互和通信。在本文中,我们将探讨如何使用 Intent 跳转到系统...
ContentProvider是Android中数据共享的标准接口,它允许应用程序间安全地共享数据。 查询通话记录通常使用`ContentResolver`的`query()`方法。例如,要获取所有通话记录,可以这样做: ```java ContentResolver ...
这里我们深入探讨“android Contacts”源码,这是一份非常有价值的参考资料,对于理解Android系统中联系人管理的内部工作原理以及学习如何开发自己的联系人应用具有重要意义。 1. **数据存储结构** Android的...
在Android 8.1(API级别27)中,谷歌为Contacts应用提供了开源代码,这为我们深入了解Android系统中联系人管理的实现提供了宝贵资源。"android go"是针对低配置设备优化的Android版本,它强调效率和性能。在这个源码...
本源码分析将深入探讨Android 5.0 Contacts的实现机制、核心类与组件,以及其在系统中的作用。 1. **数据存储** Android 5.0 Contacts采用SQLite数据库存储联系人信息。主要的数据库表包括`contacts`、`raw_...
Android中的color资源文件可以用来存储这些颜色值,而Typeface对象则用于设置自定义字体。 为了实现动画效果,比如滑动接听或滑动拒接,开发者可能会使用手势识别库,如GestureDetector或Scroller类。通过监听用户...
Content Providers是Android中负责数据共享的关键组件,Contacts Provider就是其中之一,它负责管理联系人数据库,提供数据读写接口。 在源码中,我们可以看到Contacts Provider主要由两个表构成:Contacts表和...
本文将深度剖析这一版本的Contacts代码,帮助开发者理解其内部工作原理,提升对Android联系人管理系统的理解。 1. **数据存储** Android的Contacts应用依赖于Content Provider来存储和检索联系人数据。在Android ...