系列文章:
- 联系人项目(知识预热)
- 联系人项目(ViewPager和底部联动)
- 联系人项目(查询联系人数据)
- 联系人项目(显示联系人数据)
- 联系人项目(显示通话记录)
- 联系人项目(显示拨号界面)
- 联系人项目(短信显示)
- 联系人项目(短信详情显示)
- 联系人项目(总)
首先增加一些通话记录数据,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>