2013-10-15 86 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