android从一个按日期排序的列表中的两个游标获取数据

android从一个按日期排序的列表中的两个游标获取数据,android,android-contentprovider,Android,Android Contentprovider,我想在一个列表视图中按日期排序显示通话历史记录和收件箱消息中的电话号码。我使用两个游标;一个检索呼叫,另一个检索传入消息。其中两个按日期排序。但我先填充联系人,然后填充消息。 如何使用按日期排序的联系人和邮件填充此列表 这是我的代码: public static List<Call> getCallHistory() { boolean filter = context.getSharedPreferences(PREFERENCES_NAME, Context.MO

我想在一个
列表视图中按日期排序显示通话历史记录和收件箱消息中的电话号码。我使用两个游标;一个检索呼叫,另一个检索传入消息。其中两个按日期排序。但我先填充联系人,然后填充消息。
如何使用按日期排序的联系人和邮件填充此列表

这是我的代码:

    public static List<Call> getCallHistory() {
    boolean filter = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE).getInt("filter", 0) == 1;
    String[] strFields = { CallLog.Calls._ID, CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE, CallLog.Calls.DATE,
            CallLog.Calls.DURATION };
    String strOrder = CallLog.Calls.DATE + " DESC";
    final Cursor cursorCall = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, strFields, null, null, strOrder);

    List<Call> callList = new ArrayList<Call>();

    while (cursorCall.moveToNext()) {
        Call call = new Call();
        call.setNumber(cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.NUMBER)));
        if (cursorCall.getInt(cursorCall.getColumnIndex(CallLog.Calls.TYPE)) == CallLog.Calls.OUTGOING_TYPE) {
            call.setOut(true);
        } else {
            call.setOut(false);
        }

        call.setName(cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.CACHED_NAME)));
        call.setTime(cursorCall.getLong(cursorCall.getColumnIndex(CallLog.Calls.DATE)));
        call.setDuration(cursorCall.getLong(cursorCall.getColumnIndex(CallLog.Calls.DURATION)));

        if (filter && cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.CACHED_NAME)) != null) {
            continue;
        }
        callList.add(call);
    }
    cursorCall.close();
    return getMessageHistory(callList);
    // return callList;
}

public static List<Call> getMessageHistory(List<Call> callList) {
    String[] projection = { "address", "date", "body" };
    String sortOrder = "date DESC";
    Cursor cursor = context.getContentResolver().query(SMS_INBOX_CONTENT_URI, projection, null, null, sortOrder);
    while (cursor.moveToNext()) {

        Call call = new Call();
        call.setNumber(cursor.getString(cursor.getColumnIndex("address")));
        call.setTime(cursor.getLong(cursor.getColumnIndex("date")));
        call.setBody(cursor.getString(cursor.getColumnIndex("body")));
        call.setSms(true);

        callList.add(call);
    }
    return callList;
}
公共静态列表getCallHistory(){
布尔过滤器=context.getSharedReferences(首选项\u名称,context.MODE\u私有)。getInt(“过滤器”,0)=1;
String[]strFields={CallLog.Calls.\u ID,CallLog.Calls.NUMBER,CallLog.Calls.CACHED\u NAME,CallLog.Calls.TYPE,CallLog.Calls.DATE,
CallLog.Calls.DURATION};
字符串strOrder=CallLog.Calls.DATE+“DESC”;
最终游标cursorCall=context.getContentResolver().query(CallLog.Calls.CONTENT_URI,strFields,null,null,strOrder);
List callList=new ArrayList();
while(cursorCall.moveToNext()){
Call Call=new Call();
call.setNumber(cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.NUMBER));
if(cursorCall.getInt(cursorCall.getColumnIndex(CallLog.Calls.TYPE))==CallLog.Calls.OUTGOING\u TYPE){
呼叫。出发(正确);
}否则{
呼叫。出发(错误);
}
call.setName(cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.CACHED_NAME));
setTime(cursorCall.getLong(cursorCall.getColumnIndex(CallLog.Calls.DATE));
setDuration(cursorCall.getLong(cursorCall.getColumnIndex(CallLog.Calls.DURATION));
if(filter&&cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.CACHED_NAME))!=null){
继续;
}
callList.add(call);
}
cursorCall.close();
返回getMessageHistory(调用列表);
//返回呼叫列表;
}
公共静态列表getMessageHistory(列表调用列表){
字符串[]投影={“地址”、“日期”、“正文”};
字符串sortOrder=“日期描述”;
Cursor Cursor=context.getContentResolver().query(SMS\u收件箱\u内容\u URI,投影,null,null,sortOrder);
while(cursor.moveToNext()){
Call Call=new Call();
call.setNumber(cursor.getString(cursor.getColumnIndex(“地址”));
call.setTime(cursor.getLong(cursor.getColumnIndex(“日期”));
call.setBody(cursor.getString(cursor.getColumnIndex(“body”));
call.setSms(true);
callList.add(call);
}
返回呼叫列表;
}

你应该使用Android,它就是为了这个目的而创建的

就你的情况来说

Cursor cursorCall = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, strFields, null, null, strOrder);
Cursor cursorInbox = context.getContentResolver().query(SMS_INBOX_CONTENT_URI, projection, null, null, sortOrder);
Cursor merged = new MergeCursor(new Cursor[] { cursorCall, cursorInbox });

如果列不匹配导致出现问题,您可以使用来对齐它们。

您可以提供一个使用mergeCursor的示例吗?我更新了我的答案,但mergeCursor非常简单,我没有完整的代码来构建整个解决方案。感谢您的回答,但它对我没有帮助。我使用Comparator jave类处理它,该类包含按日期排序的列表。如果有人需要解决方案,我可以把它写在下面。好的,正如你所知道的,听起来你在内存中建立了两个列表,将它们组合起来,然后在内存中排序。对于小型数据集来说,这很好,但是如果用户有大量的呼叫和消息,您将遇到内存问题