SMS-MMS加载列表显示

Android4.2

程序读取数据库中短彩信后用ListView来显示信息,所显示用的适配器为MessageListAdapter。

在适配器的bindView方法中构建MessageItem对象,此对象存储了cursor里的所以信息。每一条View是MessageListItem,MessageListItem调用bind方法把MessageItem传递进去。

bind方法中,一般情况走bindCommonMessage(sameItem)方法。bindCommonMessage方法中短信与彩信在显示文字流程中一致。之后如果是短信则隐藏MMS相关的View。

彩信的加载:

由于彩信的MessageItem在构造时并没有对mSlideshow赋值,在bindCommonMessage方法中,如果mSlideshow==null,则注册PduLoadedCallback接口。而在MessageItem构造时:

            mItemLoadedFuture = MmsApp.getApplication().getPduLoaderManager()
                    .getPdu(mMessageUri, loadSlideshow,
                    new PduLoadedMessageItemCallback());
在第一次调用getPdu方法时,在PduTask这个Runnable内调用了接口方法,一直回调到bindCommonMessage方法内注册的那个接口方法,方法里又调用了bindCommonMessage方法一次,这次mSlideshow不再为空走else流程显示View.

在getPdu方法内会把SlideshowModel以uri为key存在缓存内,之后访问不再走PduTask,而是直接调用接口方法。注意:缓存PduCache在代码中没有put,其实在PduTask方法的mPduPersister.load(mUri)里put了,单例模式。

第一次打开彩信时bindCommonMessage被调用了3次,其中bindView被调用两次,第一次时启动了PduTask,而Contact调用了接口方法onUpdata导致在主界面的onUpdata方法被调用,进而调用了适配器的刷新,而刷新会导致存在缓存中的MessageItem被清空,从而又构造了一遍MessageItem。待主线程方法执行完后PduTask启动执行。


点击事件:

在ComposeMessageActivity类中给ListView注册了点击事件

        mMsgListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                if (view != null) {
                    ((MessageListItem) view).onMessageListItemClick();
                }
            }
        });
而在彩信流程中的drawPlaybackButton方法中又注册了一次,不过调用的方法相同。在此方法中注册了中心播放按钮mSlideShowButton的点击事件。

setOnClickListener方法中注册了附件图片的点击与长按事件。

长按事件:

mMsgListView.setOnCreateContextMenuListener(mMsgListMenuCreateListener);


你可能感兴趣的:(framework)