本文用到的RecyclerView標題懸浮,參考連接
先看看圖片詳情:
device-2017-01-08-113015.png
device-2017-01-08-113047.png
獲取通訊錄之后按照時間.類型分類,同一號碼同一類型在當天只出現一次
因為考慮到還有懸停的問題,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;
}
以上就是重要的兩部分
源碼地址