首先根据当前回话,查询数据库,加载信息条目。每一个信息条目,每一条信息条目,用视图MessageListItem来显示,信息内容数据包装在MessageItem中。
MessageListAdapter.java
public View newView(Context context, Cursor cursor, ViewGroup parent) {
int boxType = getItemViewType(cursor);
View view = mInflater.inflate((boxType == INCOMING_ITEM_TYPE_SMS ||
boxType == INCOMING_ITEM_TYPE_MMS)
R.layout.message_list_item_recv : R.layout.message_list_item_send,
parent, false);
if (boxType == INCOMING_ITEM_TYPE_MMS || boxType == OUTGOING_ITEM_TYPE_MMS) {
// We've got an mms item, pre-inflate the mms portion of the view
view.findViewById(R.id.mms_layout_view_stub).setVisibility(View.VISIBLE);
}
return view;
}
这个view就是MessageLIstItem。然后MessagelistAdapter会调用bindView方法,完成视图的加载,在加载中,主要是调用MessageItem的bind方法。我们现在主要关心的是MessageItem对彩信内容数据的加载,以及着重注意异步加载幻灯片附件的逻辑处理。
@Override
public void bindView(View view, Context context, Cursor cursor) {
if (view instanceof MessageListItem) {
String type = cursor.getString(mColumnsMap.mColumnMsgType);
long msgId = cursor.getLong(mColumnsMap.mColumnMsgId);
MessageItem msgItem = getCachedMessageItem(type, msgId, cursor);
if (msgItem != null) {
MessageListItem mli = (MessageListItem) view;
int position = cursor.getPosition();
mli.bind(msgItem, position == cursor.getCount() - 1, position);
mli.setMsgListItemHandler(mMsgListItemHandler);
}
}
}
根据信息的type以及msgId,通过getCachedMessageItem方法,得到一个MessageItem。
public MessageItem getCachedMessageItem(String type, long msgId, Cursor c) {
MessageItem item = mMessageItemCache.get(getKey(type, msgId));
if (item == null && c != null && isCursorValid(c)) {
try {
item = new MessageItem(mContext, type, c, mColumnsMap, mHighlight, mFullTimestamp, mSentTimestamp);
mMessageItemCache.put(getKey(item.mType, item.mMsgId), item);
} catch (MmsException e) {
Log.e(TAG, "getCachedMessageItem: ", e);
}
}
return item;
}