系列文章:
- 联系人项目(知识预热)
- 联系人项目(ViewPager和底部联动)
- 联系人项目(查询联系人数据)
- 联系人项目(显示联系人数据)
- 联系人项目(显示通话记录)
- 联系人项目(显示拨号界面)
- 联系人项目(短信显示)
- 联系人项目(短信详情显示)
- 联系人项目(总)
新建MessageActivity
public class MessageActivity extends Activity implements IMessageView {
private List<Sms> smss;
private int thread_id;
private IMessagePresenter presenter;
private MessageAdapter adapter;
private ListView listView;
public MessageActivity() {
presenter = new MessagePresenterImpl(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
setViews();
//获取thread_id
thread_id = getIntent().getIntExtra("thread_id",0);
//执行MVP流程
presenter.loadAllMessages(thread_id);
}
private void setViews() {
listView = findViewById(R.id.listView);
}
@Override
public void setData(List<Sms> smss) {
this.smss = smss;
}
@Override
public void showList() {
//自定义Adapter
adapter = new MessageAdapter(this,smss);
listView.setAdapter(adapter);
}
}
新建activity_message.xml
<?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">
<ImageView
android:id="@+id/add_contact"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:src="@mipmap/back" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="人名er" />
</RelativeLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/ll_bottom"
android:layout_below="@+id/toolbar"
android:listSelector="@android:color/transparent">
</ListView>
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:src="@mipmap/add_msg" />
<EditText
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送" />
</LinearLayout>
</RelativeLayout>
SmsFragment给listview加监听
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Conversation c = cs.get(i);
int thread_id = c.getId();
Intent intent = new Intent(getActivity(), MessageActivity.class);
intent.putExtra("thread_id",thread_id);
startActivity(intent);
}
});
创建IMessageView
public interface IMessageView {
/**
* 设置数据源
* @param sms
*/
void setData(List<Sms> sms);
/**
* 呈现列表
*/
void showList();
}
创建实体类Sms
public class Sms {
private int id;
private long date;
private String body;
private int type;
//构造方法、get、set方法
}
创建IMessagePresenter
public interface IMessagePresenter {
/**
* 通过thread_id加载短消息
* @param thread_id
*/
public void loadAllMessages(int thread_id);
}
ISmsModel增加通过threadId获取短信的方法
public interface ISmsModel {
/**
* 铜鼓threadId查询数据库,获取符合要求的短信
* @param threadId
* @return
*/
List<Sms> findSmsByThreadId(int threadId);
.....
}
SmsModelImpl重写该方法
@Override
public List<Sms> findSmsByThreadId(int threadId) {
ContentResolver r = Myapplication.getApp().getContentResolver();
Uri uri = Uri.parse("content://sms/");
String[] columns = {"_id",//0
"date",//1
"body",//2
"type"//3
};
Cursor c = r.query(uri, columns, "thread_id=?", new String[]{threadId + ""}, "date asc");
List<Sms> smss = new ArrayList<Sms>();
while (c.moveToNext()){
Sms sms = new Sms();
sms.setId(c.getInt(0));
sms.setDate(c.getLong(1));
sms.setBody(c.getString(2));
sms.setType(c.getInt(3));
smss.add(sms);
}
c.close();
return smss;
}
新增MessagePresenterImpl
public class MessagePresenterImpl implements IMessagePresenter {
private IMessageView view;
private ISmsModel model;
public MessagePresenterImpl(IMessageView view){
this.view = view;
this.model = new SmsModelImpl();
}
@Override
public void loadAllMessages(int thread_id) {
List<Sms> smss = model.findSmsByThreadId(thread_id);
view.setData(smss);
view.showList();
}
}
短信对话列表实际上是一个listview,根据对话类型(接收或发送)展示不同布局
新建MessageAdapter
public class MessageAdapter extends BaseAdapter {
private Context context;
private List<Sms> smss;
public MessageAdapter(Context context, List<Sms> smss) {
this.context = context;
this.smss = smss;
}
@Override
public int getCount() {
return smss.size();
}
@Override
public Sms getItem(int i) {
return smss.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
/***
* 需要重新显示布局的情况有2中
* 1、没有可以重用的view
* 2、当前需要显示的item类型与view中的类型不一致
*/
if(view == null || getType(i)!=((ViewHolder)view.getTag()).type){
if(getType(i) == TYPE_LEFT){
view = View.inflate(context,R.layout.item_lv_message_left,null);
}else {
view = View.inflate(context,R.layout.item_lv_message_right,null);
}
viewHolder = new ViewHolder();
viewHolder.tv_date = view.findViewById(R.id.tv_date);
viewHolder.img_photo = view.findViewById(R.id.img_photo);
viewHolder.tv_body = view.findViewById(R.id.tv_body);
viewHolder.type = getType(i);
view.setTag(viewHolder);
}
viewHolder = (ViewHolder) view.getTag();
Sms sms = getItem(i);
//viewHolder.img_photo.setImageResource(R.mipmap.add);
viewHolder.tv_date.setText(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date(sms.getDate())));
viewHolder.tv_body.setText(sms.getBody());
return view;
}
class ViewHolder{
TextView tv_date;
CircleImageView img_photo;
TextView tv_body;
int type;//用于存储布局类型
}
public static final int TYPE_LEFT = 1;
public static final int TYPE_RIGHT = 2;
public int getType(int position){
return getItem(position).getType();
}
}
新建两种布局
item_lv_message_left
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center_vertical"
>
<TextView
android:id="@+id/tv_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1111-11-11 11:11"
android:gravity="center"
/>
<com.example.xx.contactapplication.ui.CircleImageView
android:id="@+id/img_photo"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/ic_launcher"
android:layout_marginRight="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:layout_below="@+id/tv_date"/>
<TextView
android:id="@+id/tv_body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1111-11-11 11:11"
android:gravity="center|left"
android:layout_below="@+id/tv_date"
android:layout_toRightOf="@+id/img_photo"
android:minHeight="40dp"
/>
</RelativeLayout>
item_lv_message_right
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center_vertical"
>
<TextView
android:id="@+id/tv_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1111-11-11 11:11"
android:gravity="center"
/>
<com.example.xx.contactapplication.ui.CircleImageView
android:id="@+id/img_photo"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/ic_launcher"
android:layout_marginRight="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:layout_below="@+id/tv_date"
android:layout_alignParentRight="true"/>
<TextView
android:id="@+id/tv_body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1111-11-11 11:11"
android:gravity="center|left"
android:layout_below="@+id/tv_date"
android:layout_toLeftOf="@+id/img_photo"
android:minHeight="40dp"
android:paddingLeft="5dp"
android:background="#81D8D0"
/>
</RelativeLayout>