【達內課程】聯絡人專案(顯示通話記錄)
阿新 • • 發佈:2018-12-26
首先增加一些通話記錄資料,Android Studio模擬機 模擬通話
思路:
View層
ICalllogView{
void setData(list);
void showList();
}
CallLogFragment impl ICalllogView{
onCreateView{
//載入並呈現所有的通話記錄
presenter.loadAllCalllogs();
}
void setData(List<Calllog> logs){};
void showList(){};
}
Presenter層
ICalllogPresenter{ List<Calllog> list = void loadAllCalllogs(); view.setData(list); view.showList(); } CalllogPresenterImpl impl ICalllogPresenter{ void loadAllCalllogs(){ model.findAll(); } }
Model層
ICalllogModel{
List<Calllog> findAll();
}
ICalllogModelImpl impl ICalllogModel{
List<Calllog> findAll(){
//查詢資料庫,封裝所有通話記錄,返回list
}
}
主要程式碼如下:
ICalllogView
public interface ICalllogView { /** * 設定資料來源 * @param list */ void setData(List<CallLog> list); /** * 呈現列表 */ void showList(); }
Calllog
public class Calllog { private int id; private int photoId; private String name; private int type; private String number; private long date; public Calllog() { } public Calllog(int id, int photoId, String name, int type, String number, long date) { this.id = id; this.photoId = photoId; this.name = name; this.type = type; this.number = number; this.date = date; } //各個屬性set和get方法。省略
ICalllogPresenter
public interface ICalllogPresenter {
//載入所有通話記錄,載入完畢後呼叫view的方法更新UI
void loadAllCalllogs();
}
CalllogPresenterImpl
public class CalllogPresenterImpl implements ICalllogPresenter {
private ICalllogModel model;
private ICalllogView view;
public CalllogPresenterImpl(ICalllogView view) {
this.view = view;
model = new CalllogModelImpl();
}
@Override
public void loadAllCalllogs() {
List<Calllog> logs = model.findAll();
view.setData(logs);
view.showList();
}
}
ICalllogModel
public interface ICalllogModel {
/**
* 查詢所有通話記錄
* @return
*/
List<Calllog> findAll();
}
CalllogModelImpl
public class CalllogModelImpl implements ICalllogModel {
@Override
public List<Calllog> findAll() {
Uri uri = CallLog.Calls.CONTENT_URI;
ContentResolver r = Myapplication.getApp().getContentResolver();
String[] columns = {CallLog.Calls._ID,//0
"photo_id",//1
"name", //2
CallLog.Calls.TYPE,//3
CallLog.Calls.NUMBER,//4
CallLog.Calls.DATE//5
};
Cursor c = r.query(uri,columns,null,null, CallLog.Calls.DATE+" desc");
List<Calllog> logs = new ArrayList<Calllog>();
while (c.moveToNext()){
Calllog calllog = new Calllog(c.getInt(0),c.getInt(1),c.getString(2),c.getInt(3),c.getString(4),c.getLong(5));
logs.add(calllog);
}
c.close();
return logs;
}
}
CalllogAdapter
public class CalllogAdapter extends BaseAdapter {
private List<Calllog> list;
private Context context;
public CalllogAdapter(List<Calllog> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if(view == null){
view = View.inflate(context,R.layout.item_calllog,null);
viewHolder = new ViewHolder();
viewHolder.img_photo = view.findViewById(R.id.img_photo);
viewHolder.tv_name = view.findViewById(R.id.tv_name);
viewHolder.img_call = view.findViewById(R.id.img_call);
viewHolder.tv_number = view.findViewById(R.id.tv_number);
viewHolder.tv_time = view.findViewById(R.id.tv_time);
view.setTag(viewHolder);
}
viewHolder = (ViewHolder) view.getTag();
//設定值
Calllog item = (Calllog) list.get(i);
Bitmap b = BitmapUtils.getPhoto(item.getPhotoId());
if(b!=null){
viewHolder.img_photo.setImageBitmap(b);
}else {
viewHolder.img_photo.setImageResource(R.mipmap.ic_launcher);
}
viewHolder.tv_name.setText(item.getName());
//設定name顏色
if(item.getType() == CallLog.Calls.MISSED_TYPE){
viewHolder.tv_name.setTextColor(Color.RED);
}else {
viewHolder.tv_name.setTextColor(Color.BLACK);
}
//設定電話
viewHolder.tv_number.setText(item.getNumber());
//設定時間
String d = DateUtils.parseDate(item.getDate());
viewHolder.tv_time.setText(d);
//設定撥出圖片
if(item.getType() == CallLog.Calls.OUTGOING_TYPE){
viewHolder.img_call.setVisibility(View.VISIBLE);
}else {
viewHolder.img_call.setVisibility(View.GONE);
}
return view;
}
class ViewHolder{
ImageView img_photo;
TextView tv_name;
ImageView img_call;
TextView tv_number;
TextView tv_time;
}
}
item_calllog
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center_vertical"
>
<com.example.xx.contactapplication.ui.CircleImageView
android:id="@+id/img_photo"
android:layout_width="45dp"
android:layout_height="45dp"
android:src="@mipmap/ic_launcher"
android:layout_marginRight="10dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="甄嬛"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:id="@+id/img_call"
android:layout_width="10dp"
android:layout_height="10dp"
android:src="@mipmap/ic_launcher"
android:layout_marginRight="3dp"/>
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="13333333333"/>
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="08:00"
android:textSize="20dp"/>
</LinearLayout>
DateUtils
package com.example.xx.contactapplication.util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DateUtils {
private static SimpleDateFormat sdf = new SimpleDateFormat("HH:ss");
public static String parseDate(long date){
//描述當前時間
Calendar now = Calendar.getInstance();
//描述date時間
Calendar other = Calendar.getInstance();
other.setTimeInMillis(date);
//是不是當天
if(now.get(Calendar.YEAR)==other.get(Calendar.YEAR)&&
now.get(Calendar.DAY_OF_YEAR)==other.get(Calendar.DAY_OF_YEAR)){
return sdf.format(other.getTime());
}
//判斷是不是昨天
now.add(Calendar.DAY_OF_YEAR,-1);
if(now.get(Calendar.YEAR)==other.get(Calendar.YEAR)&&
now.get(Calendar.DAY_OF_YEAR)==other.get(Calendar.DAY_OF_YEAR)){
return "昨天";
}
//判斷星期幾
int day = other.get(Calendar.DAY_OF_WEEK);
String dayString = "";
switch (day){
case Calendar.MONDAY:
dayString = "星期一";
break;
case Calendar.TUESDAY:
dayString = "星期二";
break;
case Calendar.WEDNESDAY:
dayString = "星期三";
break;
case Calendar.THURSDAY:
dayString = "星期四";
break;
case Calendar.FRIDAY:
dayString = "星期五";
break;
case Calendar.SATURDAY:
dayString = "星期六";
break;
case Calendar.SUNDAY:
dayString = "星期天";
break;
default:
break;
}
return dayString;
}
}
CalllogFragment
public class CallLogFragment extends Fragment implements ICalllogView{
private ICalllogPresenter presenter;
private List<Calllog> list;
private ListView listView;
private CalllogAdapter adapter;
public CallLogFragment(){
this.presenter = new CalllogPresenterImpl(this);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_calllog,null);
listView = view.findViewById(R.id.listView);
//查詢所有通話記錄,更新listview
presenter.loadAllCalllogs();
return view;
}
@Override
public void setData(List<Calllog> list) {
this.list = list;
}
@Override
public void showList() {
adapter = new CalllogAdapter(list,getActivity());
listView.setAdapter(adapter);
}
}
fragment_calllog
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.ContactFragment">
<RelativeLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#fffff0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通話記錄"
android:layout_centerInParent="true"/>
</RelativeLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/toolbar"
>
</ListView>
</RelativeLayout>