系列文章:
- 联系人项目(知识预热)
- 联系人项目(ViewPager和底部联动)
- 联系人项目(查询联系人数据)
- 联系人项目(显示联系人数据)
- 联系人项目(显示通话记录)
- 联系人项目(显示拨号界面)
- 联系人项目(短信显示)
- 联系人项目(短信详情显示)
- 联系人项目(总)
新建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中来访问
页面显示已经写过很多次了,这里就不写了