本文用到的RecyclerView标题悬浮,参考连接
先看看图片详情:
获取通讯录之后按照时间.类型分类,同一号码同一类型在当天只出现一次
因为考虑到还有悬停的问题,RecyclerView学习(四)----城市导航列表的实现(上)中的思想是:获取对象名字的拼音然后排序,他这样做是为了侧边索引。因为本文并不需要用到索引,所以并不需要获取拼音,只获取每个通话的时间yyyy-MM-dd,通过比较时间(eques),这样就可以根据悬浮的原理来实现日期分类
一直有个疑问:Java为什么会有eques,感觉跟牵强啊
我实现分类的思想是:因为我查询通话记录是按照时间顺序来的。
/**
* 获取所有的通话记录
*
* @param context
*/
public void getCallLog(Context context) {
try {
callInfoLogs.clear();
ContentResolver cr = context.getContentResolver();
Uri uri = CallLog.Calls.CONTENT_URI;
String[] projection = new String[]{CallLog.Calls.NUMBER, CallLog.Calls.DATE,
CallLog.Calls.TYPE, CallLog.Calls.CACHED_NAME, CallLog.Calls.DURATION, CallLog.Calls.GEOCODED_LOCATION};
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
}
Cursor cursor = cr.query(uri, projection, null, null, CallLog.Calls.DATE + " DESC");
while (cursor.moveToNext()) {
CallInfoLog callInfoLog = new CallInfoLog();
String number = cursor.getString(0);//电话号码
long date = cursor.getLong(1);//通话时间
int type = cursor.getInt(2);//通话类型
String name = cursor.getString(3);//名字
String duration = cursor.getString(4);//通话时长
String areaCode = cursor.getString(5);//归属地
String callTime = TransitionTime.convertTimeFirstStyle(date);//格式化时间yyyy-MM-dd
if (TransitionTime.getTodayData().equals(callTime)) {//如果是今天的话
callInfoLog.setCallTime("今天");
} else if (TransitionTime.getYesData().equals(callTime)) {
callInfoLog.setCallTime("昨天");
} else {
callInfoLog.setCallTime(callTime);
}
callInfoLog.setNumber(number);
callInfoLog.setDate(date);
callInfoLog.setType(type);
callInfoLog.setName(name);
callInfoLog.setCountType(1);
callInfoLog.setDuration(duration);
callInfoLog.setCode(areaCode);
//筛选数据
if (TextUtils.isEmpty(number)) {
callInfoLogs.add(callInfoLog);
continue;
}
boolean isadd = screenData(callInfoLogs, callInfoLog);
if (isadd) {
callInfoLogs.add(callInfoLog);
}
}
cursor.close();
callLogAdapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
顺便说下:
查看电话记录---CallLog.Calls.CONTENT_URI
CallLog.Calls.CACHED_NAME查询的联系人名字
CallLog.Calls.TYPE电话类型,
CallLog.Calls.NUMBER电话号码
CallLog.Calls.DATE电话日期
(注意:CallLog.Calls.TYPE电话类型的取值 来电:1,拨出:2,未接:3)
查询出来的数据按照:cursor.moveToNext() 时都是按照最新的先获取,所以数据筛选时都要和之前的数据对比,如果是同一号码同一类型同一天的话就不在放入集合中,而是给已经存在的最新的数量上+1。
/**
* 筛选数据
* @param callInfoLogs
* @param info
* @return
*/
private boolean screenData(ArrayList<CallInfoLog> callInfoLogs, CallInfoLog info) {
if (callInfoLogs.size() > 0) {
for (int i = 0; i < callInfoLogs.size(); i++) {
CallInfoLog callInfoLog = callInfoLogs.get(i);
//如果说是日期和类型全部一样的话那么这个通话记录就不要,变成一个数量归为最近一次记录里面
if (callInfoLog.getCallTime().equals(info.getCallTime()) && callInfoLog.getType() == info.getType() && info.getNumber().equals(callInfoLog.getNumber())) {
callInfoLog.setCountType(callInfoLog.getCountType() + 1);//递增一次
//结束这次数据查找
return false;
}
}
}
return true;
}
以上就是重要的两部分
源码地址