通话记录数据保存的位置: 在contact2.db中的calls数据表中 利用ContentProvider查询Calls表中的数据: Calls表的URI:CallLog.Calls.CONTENT_URI Calls表中的列所对应的常量 _id ----> CallLog.Calls._ID photo_id ----> CallLog.Calls.CACHED_PHOTO_ID/"photo_id" type ----> CallLog.Calls.TYPE number ----> CallLog.Calls.NUMBER; time ----> CallLog.Calls.DATE; name ----> CallLog.Calls.CACHED_NAME; 条目布局的注意事项: 1)头像的处理:头像位置要使用一个RelativeLayout 或FrameLayout,里面包括一大一小两个ImageView。 大的ImageView用来显示头像,默认可见 小的ImageView用来显示陌生人的惊叹号,默认不可见 根据ListView显示条目的calllog的name属性值来决定 小的ImageView是否可见 2)用户姓名字体颜色的处理 根据calllog的type属性的属性值来设定name的颜色 如果type为3,代表着这是一个未接电话,需要用红色显示名字 如果为其它取值,用黑色显示名字 3)呼出电话小图标的处理 与1)中惊叹号图标的处理方式类似。所有的条目布局中都包含 一个呼出电话的小图标。默认时该图标不可见。如果ListView显示 条目的type属性值为2时,该图标可见。 4)通话时间的处理 今天发生的通话,用“时时:分分”来表示 昨天发生的通话,用“昨天”来表示 前天发生的通话,用“前天”来表示 更早发生的通话,用“年年年年/月月/日日”来表示 注意:对于昨天,前天和年月日显示是否也需要“时时:分分” 自行决定吧 调优: 1)calllog内容的加载最好使用异步的方式进行 style的用法 在写布局文件的时候,如果有大量的相同属性在使用 可以把这些重复的属性提取到style.xml文件中 比如,友录项目中,在写headerview_layout的时候 左侧IamgeView和右侧ImageView的layout_width layout_height和layout_gravity三个属性的值都一样 可以将其提取为一个自定义的style <style name="HeaderViewImageView"> <item name="android:layout_width">30dp</item> <item name="android:layout_height">30dp</item> <item name="android:layout_gravity">center_vertical</item> </style> 这样,就没有必要在布局文件中再次写这三个属性了 直接引用该style即可: <ImageView android:id="@+id/iv_headerview_left" style="@style/HeaderViewImageView" android:layout_marginLeft="10dp" /> <ImageView android:id="@+id/iv_headerview_right" style="@style/HeaderViewImageView" android:layout_marginRight="10dp" /> BaseFragment的使用 如果多个Fragment中存在重复的代码逻辑, 可以将这部分代码进行提取,放到父类中。 这样各个子Fragment通过继承就可以使用这些 方法,而不用重复的写相同的代码。 由于Java不支持多继承机制,所以要改变以下继承层次 从原先的: ContactFragment----->Fragment CalllogFragment----->Fragment 变成现在的: ContactFragment---->BaseFragment---->Fragment CalllogFragment---->BaseFragment---->Fragment 将ContactFragment和CalllogFragment中相同逻辑的 代码提取到BaseFragment中。 利用电话号码反查头像ID calls表中的photo_id列数据存在一个小问题,当对方 拨打电话进来时,如果没有接听,则对方的头像ID值是 不会记录在calls表中的。此时CalllogFragment中显示 该条通话记录的时候就不会有头像出现。所以,需要利用 电话号码去其它表中查询该用户的头像ID。 利用电话号码查询头像ID最简单的方式就是利用phone_lookup表的 ContentProvider来进行查询。查询时需要注意的是,该ContentProvider 支持的Uri格式为: Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 电话号码); 完整的利用电话号码查询头像id的代码实例为: protected static int getPhotoIdByNumber(Context context,String number) { int photoId = 0; //利用phone_lookup数据表所对应的ContentProvider进行查询 ContentResolver cr = context.getContentResolver(); Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number); Cursor c = cr.query(uri , new String[]{PhoneLookup.PHOTO_ID}, null, null, null); //如果提供的电话号码确实是有头像的 if(c.moveToNext()){ photoId = c.getInt(0); } c.close(); return photoId; } 利用adapter删除数据时 如果没有及时更新ListView中的数据显示 会导致异常: 异常信息是说不能从非UI线程更新ListView
关于自定义通话记录的查找等等。。。
最新推荐文章于 2024-08-16 14:43:42 发布