2013-10-15 84 views
0

我必須創建一個類似於android通話記錄的活動。我還沒有找到關於它的很多信息。我發現了什麼是本實施例中,具有一個主活動,其中有3個按鈕:Android風格通話記錄

1-呼出列表 2-內遷呼叫列表 3-未接電話列表中

而且每個按鈕發送到另一個活動這是一個列表視圖,每個調用的細節。

但我需要的,是首先要統一所有這個應用程序到一個唯一的佈局,至極顯示所有錯過,outoging和遷入同時通話,按日期上市。我現在認爲這應該很簡單,但我無法做到這一點,這是因爲我向你求助。在此之後,我應該做的下一件事是修改listview佈局,以顯示android顯示的通話記錄,通過手機圖標和如果您觸摸該名稱可以調用該人的選項。

但首先,我需要應用程序以我需要的方式運行。

這是主要佈局的代碼,其中有3個按鈕:

public class CallLogsDemoActivity extends Activity { 

public static ArrayList<CallLogModel> outgoingList; 
public static ArrayList<CallLogModel> incomingList; 
public static ArrayList<CallLogModel> missedcallList; 

public static final int OUTGOING_CALLS = 1; 
public static final int INCOMING_CALLS = 2; 
public static final int MISSED_CALLS = 3; 

public static final String CALL_TYPE = "TYPE"; 

private Button inBtn, outBtn, missedBtn; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    outBtn = (Button) findViewById(R.id.button1); 
    inBtn = (Button) findViewById(R.id.button2); 
    missedBtn = (Button) findViewById(R.id.button3); 

    inBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      showIncomingList(); 
     } 
    }); 
    outBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      showOutGoingList(); 
     } 
    }); 
    missedBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      showMissedList(); 
     } 
    }); 
    outgoingList = new ArrayList<CallLogModel>(); 
    incomingList = new ArrayList<CallLogModel>(); 
    missedcallList = new ArrayList<CallLogModel>(); 

    new ReadLogs().execute(); 
} 

private void showIncomingList() { 
    Intent intent = new Intent(this, CallLogs.class); 
    intent.putExtra(CALL_TYPE, INCOMING_CALLS); 
    startActivity(intent); 
} 

private void showMissedList() { 
    Intent intent = new Intent(this, CallLogs.class); 
    intent.putExtra(CALL_TYPE, MISSED_CALLS); 
    startActivity(intent); 
} 

private void showOutGoingList() { 
    Intent intent = new Intent(this, CallLogs.class); 
    intent.putExtra(CALL_TYPE, OUTGOING_CALLS); 
    startActivity(intent); 
} 

private String getDuration(long milliseconds) { 
    int seconds = (int) (milliseconds/1000) % 60; 
    int minutes = (int) ((milliseconds/(1000 * 60)) % 60); 
    int hours = (int) ((milliseconds/(1000 * 60 * 60)) % 24); 
    if (hours < 1) 
     return minutes + ":" + seconds; 
    return hours + ":" + minutes + ":" + seconds; 
} 

private String getDateTime(long milliseconds) { 
    Date date = new Date(milliseconds); 
    //return DateFormat.getDateTimeInstance().format(new Date()); 

    return date.toLocaleString(); 
} 

private void readCallLogs() { 

    missedcallList.clear(); 
    incomingList.clear(); 
    outgoingList.clear(); 

    Cursor callLogCursor = getContentResolver().query(
      android.provider.CallLog.Calls.CONTENT_URI, null, null, null, 
      android.provider.CallLog.Calls.DEFAULT_SORT_ORDER); 
    if (callLogCursor != null) { 
     while (callLogCursor.moveToNext()) { 
      String id = callLogCursor.getString(callLogCursor 
        .getColumnIndex(CallLog.Calls._ID)); 
      String name = callLogCursor.getString(callLogCursor 
        .getColumnIndex(CallLog.Calls.CACHED_NAME)); 
      String cacheNumber = callLogCursor.getString(callLogCursor 
        .getColumnIndex(CallLog.Calls.CACHED_NUMBER_LABEL)); 
      String number = callLogCursor.getString(callLogCursor 
        .getColumnIndex(CallLog.Calls.NUMBER)); 
      long dateTimeMillis = callLogCursor.getLong(callLogCursor 
        .getColumnIndex(CallLog.Calls.DATE)); 
      long durationMillis = callLogCursor.getLong(callLogCursor 
        .getColumnIndex(CallLog.Calls.DURATION)); 
      int callType = callLogCursor.getInt(callLogCursor 
        .getColumnIndex(CallLog.Calls.TYPE)); 

      String duration = getDuration(durationMillis * 1000); 

      String dateString = getDateTime(dateTimeMillis); 

      if (cacheNumber == null) 
       cacheNumber = number; 
      if (name == null) 
       name = "No Name"; 

      CallLogModel callLogModel = new CallLogModel(name, cacheNumber, 
        duration, dateString); 
      if (callType == CallLog.Calls.OUTGOING_TYPE) { 
       outgoingList.add(callLogModel); 

      } else if (callType == CallLog.Calls.INCOMING_TYPE) { 
       incomingList.add(callLogModel); 

      } else if (callType == CallLog.Calls.MISSED_TYPE) { 
       missedcallList.add(callLogModel); 

      } 

     } 
     callLogCursor.close(); 
    } 
} 

private class ReadLogs extends AsyncTask<Void, Void, Void> { 

    /* Object */ 
    ProgressDialog dialog; 

    /* 
    * Function name: onPreExecute Parameters: Void params Return: void 
    */ 
    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     dialog = ProgressDialog.show(CallLogsDemoActivity.this, 
       "Reading Call Logs...", "Please wait...", true); 
    } 

    /* 
    * Function name: doInBackground Parameters: Void params Return: void 
    */ 
    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     readCallLogs(); 
     return null; 
    } 

    /* 
    * Function name: onPostExecute Parameters: Void result Return: void 
    */ 
    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     dialog.dismiss(); 
    } 
} 

}

而這是其他活動至極顯示列表:

public class CallLogs extends Activity { 
private ListView mainListView; 
private ArrayAdapter<CallLogModel> listAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listview); 
    mainListView = (ListView) findViewById(R.id.listView); 
    mainListView.setSmoothScrollbarEnabled(true); 

    Bundle extras = getIntent().getExtras(); 
    int callType = extras.getInt(CallLogsDemoActivity.CALL_TYPE); 
    if (callType == CallLogsDemoActivity.OUTGOING_CALLS) 
     listAdapter = new CallLogsArrayAdapter(this, 
       CallLogsDemoActivity.outgoingList); 
    else if (callType == CallLogsDemoActivity.INCOMING_CALLS) 
     listAdapter = new CallLogsArrayAdapter(this, 
       CallLogsDemoActivity.incomingList); 
    else if (callType == CallLogsDemoActivity.MISSED_CALLS) 
     listAdapter = new CallLogsArrayAdapter(this, 
       CallLogsDemoActivity.missedcallList); 
    mainListView.setAdapter(listAdapter); 

} 

public void initElements() { 
    listAdapter.notifyDataSetChanged(); 
} 

}

如上所述,我嘗試將此代碼統一爲只顯示一個佈局並顯示所有呼叫ti同時,android也會這麼做,但是沒有達到它。

+0

你面對的是什麼問題。是不是顯示列表或您面臨任何崩潰? –

+0

好的,現在我明白了,您希望所有的呼叫類型都顯示在一個列表中。沒有按任何類型過濾。對? –

+0

@Changdeo Jadhav當試圖統一所有,我不會崩潰的應用程序,但列表不顯示任何內容。我想是在一個列表,在列表中沒有通過過濾來顯示所有的呼叫類型...但我想十個分量每個呼叫類型,然後以一個圖標取決於它是否是一個missedcall,outoging來電或遷入添加到每個呼叫請致電 – masmic

回答

1

改變此密碼

int callType = extras.getInt(CallLogsDemoActivity.CALL_TYPE); 
if (callType == CallLogsDemoActivity.OUTGOING_CALLS) 
    listAdapter = new CallLogsArrayAdapter(this, 
      CallLogsDemoActivity.outgoingList); 
else if (callType == CallLogsDemoActivity.INCOMING_CALLS) 
    listAdapter = new CallLogsArrayAdapter(this, 
      CallLogsDemoActivity.incomingList); 
else if (callType == CallLogsDemoActivity.MISSED_CALLS) 
    listAdapter = new CallLogsArrayAdapter(this, 
      CallLogsDemoActivity.missedcallList); 
mainListView.setAdapter(listAdapter); 

對此

 int callType = extras.getInt(CallLogsDemoActivity.CALL_TYPE); 
    ArrayList<CallLogModel> collectiveList = new ArrayList<CallLogModel>(); 
    collectiveList.addAll(CallLogsDemoActivity.outgoingList); 
    collectiveList.addAll(CallLogsDemoActivity.incomingList); 
    collectiveList.addAll(CallLogsDemoActivity.missedcallList); 
    listAdapter = new CallLogsArrayAdapter(this,collectiveList); 
    mainListView.setAdapter(listAdapter); 
+0

或者您的asynctask只返回一個列表並使用它,而不是稍後添加所有列表。 –

+0

謝謝@Changdeo Jadhav,這樣我可以在同一個數組列表中獲得3種調用類型。但我仍然需要統一這兩項活動。我的意思是,當我啓動應用程序時,直接進入通話記錄,沒有這3個按鈕 – masmic

+0

我會設置這個答案爲接受,如果你能幫助我這個。 – masmic