【达内课程】联系人项目(短信显示)

系列文章:

  1. 联系人项目(知识预热)
  2. 联系人项目(ViewPager和底部联动)
  3. 联系人项目(查询联系人数据)
  4. 联系人项目(显示联系人数据)
  5. 联系人项目(显示通话记录)
  6. 联系人项目(显示拨号界面)
  7. 联系人项目(短信显示)
  8. 联系人项目(短信详情显示)
  9. 联系人项目(总)

新建SmsFragment

在这里插入代码片

创建对应布局fragment_sms

和fragment_calllog相同,只不过标题改成“短消息”

创建ISmsView

 */
public interface ISmsView {
    /**
     * 设置数据源
     * @param cs
     */
    void setData(List<Conversation> cs);

    /**
     * 呈现列表
     */
    void showList();
}

创建实体类Conversation

/**
 * 描述一条短信会话数据
 */
public class Conversation {
    private int id;
    private int photoId;
    private String name;
    private String number;
    private String body;
    private long date;

	set和get方法、toString方法自给自足
	}

新建ISmsPresenter

public interface ISmsPresenter {
    /**
     * 加载所有会话数据
     */
    public void loadAllConversations();
}

新建ISmsModel


public interface ISmsModel {
    /**
     * 查询所有会话
     * @return
     */
    List<Conversation> findAllConversations();
}

新建Model层实现类SmsModelImpl

public class SmsModelImpl implements ISmsModel {

    @Override
    public List<Conversation> findAllConversations() {
        Uri uri = Uri.parse("content://mms-sms/conversations/");
        ContentResolver r = Myapplication.getApp().getContentResolver();
        //测试ContentProvider到底返回了哪些字段
        Cursor c = r.query(uri, null, null, null, null);
        c.moveToFirst();
        for(int i=0;i<c.getColumnCount();i++){
        	Log.i("info","NAME:"+c.getColumnName(i)+" VALUE:"+c.getString(i));
        }
        c.close();
        return null;
    }
}

新建SmsPresenterImpl

public class SmsPresenterImpl implements ISmsPresenter {
    private ISmsView view;
    private ISmsModel model;

    public SmsPresenterImpl(ISmsView view){
        this.view = view;
        this.model = new SmsModelImpl();
    }
    @Override
    public void loadAllConversations() {
        List<Conversation> cs = model.findAllConversations();
        view.setData(cs);
        view.showList();
    }
}

manifest中增加权限

    <uses-permission android:name="android.permission.READ_SMS"/>

MainActivity中setAdapter中第三个fragment改成SmsFragment

    fragments.add(new SmsFragment());

SmsFragment

public class SmsFragment extends Fragment implements ISmsView {
    private ISmsPresenter presenter;
    private List<Conversation> cs;
    private ListView listView;
    private CalllogAdapter adapter;

    public SmsFragment(){
        this.presenter = new SmsPresenterImpl(this);
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_sms,null);
        //控件初始化
        listView = view.findViewById(R.id.listView);
        //加载所有会话数据
        presenter.loadAllConversations();
        return view;
    }

    @Override
    public void setData(List<Conversation> cs) {
        this.cs = cs;
    }

    @Override
    public void showList() {
        //自定义listview

    }
}

运行一下
在这里插入图片描述
现在查询数据,修改SmsModelImpl


public class SmsModelImpl implements ISmsModel {

    @Override
    public List<Conversation> findAllConversations() {
        Uri uri = Uri.parse("content://mms-sms/conversations/");
        ContentResolver r = Myapplication.getApp().getContentResolver();
        String[] columns = {
                "thread_id",//0 会话id
                "address", //1 电话号码
                "body",     //2 最后一条聊天记录
                "date"     //3 时间
        };
        Cursor cursor = r.query(uri,columns,null,null,"date desc");
        List<Conversation> cs = new ArrayList<Conversation>();
        while (cursor.moveToNext()){
            Conversation c = new Conversation();
            c.setId(cursor.getInt(0));
            c.setNumber(cursor.getString(1));
            c.setBody(cursor.getString(2));
            c.setDate(cursor.getLong(3));
            cs.add(c);
        }
        cursor.close();
       /* //测试ContentProvider到底返回了哪些字段
        Cursor c = r.query(uri, null, null, null, null);
        c.moveToFirst();
        for(int i=0;i<c.getColumnCount();i++){
            Log.i("info","NAME:"+c.getColumnName(i)+" VALUE:"+c.getString(i));
        }
        c.close();*/
        return cs;
    }
}

SmsFragment

public class SmsFragment extends Fragment implements ISmsView {
    private ISmsPresenter presenter;
    private List<Conversation> cs;
    private ListView listView;
    private ArrayAdapter<Conversation> adapter;

    public SmsFragment(){
        this.presenter = new SmsPresenterImpl(this);
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_sms,null);
        //控件初始化
        listView = view.findViewById(R.id.listView);
        //加载所有会话数据
        presenter.loadAllConversations();
        return view;
    }

    @Override
    public void setData(List<Conversation> cs) {
        this.cs = cs;
    }

    @Override
    public void showList() {
        //自定义listview 更新UI
        adapter = new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,cs);
        listView.setAdapter(adapter);
    }
}

先把会话列表显示出来
在这里插入图片描述

关于要显示的头像,可以
在这里插入图片描述
上边这种方式就是再从数据库中查询一遍,还有另一种方式
List<Contact>联系人列表数据已经有了(第一个页面),可以通过这个集合for循环查询。可以放到Application中来访问

页面显示已经写过很多次了,这里就不写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值