本文用到的RecyclerView標(biāo)題懸浮,參考連接
先看看圖片詳情:

device-2017-01-08-113015.png

device-2017-01-08-113047.png
獲取通訊錄之后按照時間.類型分類,同一號碼同一類型在當(dāng)天只出現(xiàn)一次
因?yàn)榭紤]到還有懸停的問題,RecyclerView學(xué)習(xí)(四)----城市導(dǎo)航列表的實(shí)現(xiàn)(上)中的思想是:獲取對象名字的拼音然后排序,他這樣做是為了側(cè)邊索引。因?yàn)楸疚牟⒉恍枰玫剿饕圆⒉恍枰@取拼音,只獲取每個通話的時間yyyy-MM-dd,通過比較時間(eques),這樣就可以根據(jù)懸浮的原理來實(shí)現(xiàn)日期分類
一直有個疑問:Java為什么會有eques,感覺跟牽強(qiáng)啊
我實(shí)現(xiàn)分類的思想是:因?yàn)槲也樵兺ㄔ捰涗浭前凑諘r間順序來的。
/**
* 獲取所有的通話記錄
*
* @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);
//篩選數(shù)據(jù)
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查詢的聯(lián)系人名字
CallLog.Calls.TYPE電話類型,
CallLog.Calls.NUMBER電話號碼
CallLog.Calls.DATE電話日期
(注意:CallLog.Calls.TYPE電話類型的取值 來電:1,撥出:2,未接:3)
查詢出來的數(shù)據(jù)按照:cursor.moveToNext() 時都是按照最新的先獲取,所以數(shù)據(jù)篩選時都要和之前的數(shù)據(jù)對比,如果是同一號碼同一類型同一天的話就不在放入集合中,而是給已經(jīng)存在的最新的數(shù)量上+1。
/**
* 篩選數(shù)據(jù)
* @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);
//如果說是日期和類型全部一樣的話那么這個通話記錄就不要,變成一個數(shù)量歸為最近一次記錄里面
if (callInfoLog.getCallTime().equals(info.getCallTime()) && callInfoLog.getType() == info.getType() && info.getNumber().equals(callInfoLog.getNumber())) {
callInfoLog.setCountType(callInfoLog.getCountType() + 1);//遞增一次
//結(jié)束這次數(shù)據(jù)查找
return false;
}
}
}
return true;
}
以上就是重要的兩部分
源碼地址