有一阵子我被list_menu给弄晕了。所有需要显示菜单列表的地方,传入的实参都是MMI_fixed_list_menu,但偏偏又有gui_show_fixed_list_menu、gui_show_dynamic_list_menu、gui_show_asyncdynamic_list_menu这三个函数。
从函数名可以看出,gui_show_fixed_list_menu显示的是固定的菜单,所谓fixed;gui_show_dynamic_list_menu显示的是动态菜单;而gui_show_asyncdynamic_list_menu则是又异步又动态(asynchronous + dynamic)。
付贵的教程《MMI实例培训教程》第十五章详细的介绍了列表控件的使用,主要流程是:
1. 设置列表控件的大小和类型
2. 设置列表项的高度和宽度
3. 设置各个列表项的文字和图标
4. 设置各个接口函数
最后,用gui_show_fixed_list_menu将它显示出来。虽然步骤有点多,一步步坐下来倒也不容易出错。
需要特别强调的是第3步,如果列表项特别多,那么这个操作就会非常费时。
以电话簿为例,联系人记录可能有千条以上,如果等一千条记录项都设置好了再进入,用户需要等待很长的时间。聪明的做法是,我先把数据准备好,显示list时再一条条的问我要。因为一屏最多只能显示十来个联系人,所以可以做到很快进入。gui_show_dynamic_list_menu干的就是这个活,当然,在显示之前,需要用init_dynamic_item_buffer设置好相关的参数。
如果另一个模块同样有上千条记录,但它比电话簿更麻烦些,因为它取记录的操作比电话簿要慢很多。OK,我说的是短信模块。
记录多,所以只能用dynamic list;取记录慢,就不能等所有记录都准备好再响应用户操作。可行的办法是,先读取少量的几条记录,进了新屏幕再说。这就是gui_show_asyncdynamic_list_menu显身手的地方。当然,它有缺点,如果用户要看还没有加载进来的短信,它要重新去取记录。显示前同样需要用init_asyncdynamic_item_buffer设置相关的参数。
gui_show_fixed_list_menu是静态的,gui_show_dynamic_list_menu和gui_show_asyncdynamic_list_menu是动态的;gui_show_dynamic_list_menu会把记录一次取得到位,gui_show_asyncdynamic_list_menu则一次只读很少的几条。
用户进入电话簿后一半是查看联系人,会不停的上下翻动,由于记录都读取进来了,所以可以做到很快响应。短信则不然,用户一半只看最近的几条,极少会翻看很久以前的,即使发生,显示一个请稍后,用户也比较能接受。
最后总结一下:如果项很少,直接用gui_show_fixed_list_menu;如果项很多,就只能选用gui_show_dynamic_list_menu或gui_show_asyncdynamic_list_menu;如果取的记录慢且用户很少随机翻动,用gui_show_asyncdynamic_list_menu,否则用gui_show_dynamic_list_menu。