1. 程式人生 > >【達內課程】聯絡人專案(顯示通話記錄)

【達內課程】聯絡人專案(顯示通話記錄)

首先增加一些通話記錄資料,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>

在這裡插入圖片描述