Linux mobile development

欢迎到Linux mobile development(www.limodev.cn)上交流。Limodev主要致力于基于linux的嵌入式系统的学习和研究,包括内核、驱动、GUI、MMI、软件设计方法和软件优化等方面,欢迎大家加入,无论是高手还是新手,一起学习共同进步。下载BLOG示例代码请先到limodev.cn/bbs上注册,谢谢

原创 让GtkListStore支持数据延迟加载的构想收藏

GtkListStore支持数据延迟加载的构想

 

转载时请注明出处:http://blog.csdn.net/absurd/

 

最近遇到一个问题,在名片列表中要显示全部名片,我们最大名片条数限制是5000条,一下子全部检索过来会非常慢。为了解决这类问题,我们在数据库封装层做了优化,即使全部检索了,但它只从数据库中取前30条,其余数据直到应用程序使用时才从数据库中获取,这种延迟加载的方式会有更好的性能表现。

 

现在才发现数据库封装层做了优化还不够,原因是GtkTreeView(也可以用来实现ListBox)不支持像Win32下的ListBox所具有Ownerdraw(自绘)功能,它需要在开始时就加载所有数据,结果仍然无法实现延迟加载,数据库封装层做的优化失去了效果。

 

为了解决这个问题,需要对GtkListStore改造。分析相关源代码后,我们发现:

1.         GtkTreeView/GtkTreeModel采用了MVC模型。GtkTreeViewview,负责显示控制,而GtkTreeModelmodel,负责数据管理。

2.         GtkTreeModel只是个接口,它有两种实现,GtkListStoreGtkTreeStore,它们分别实现了ListTree的数据管理。

3.         为了支持不同的数据表现形式,GtkTreeView并不负责每个具体项(Item)的绘制,具体项的绘制由GtkCellRenderer完成。GtkCellRenderer有几种不同的实现方式:GtkCellRendererTextGtkCellRendererPixbufGtkCellRendererToggleGtkCellRendererComboGtkCellRendererProgress

4.         在控件显示时,GtkTreeView负责从GtkTreeModel中获得数据,然后把数据传递给GtkCellRenderer,并调用GtkCellRenderer的函数去绘制。

 

很容易想到:在创建时,向GtkTreeModel加入假数据(如记录序号),直到GtkTreeViewGtkTreeModel索取数据时,才从数据库获取。但遇到两个问题:

1.         GtkTreeView和所有GtkWidget一样,先要在size_request里计算控件的大小,这里它要把每一项的get_value调用一遍,也就是说在显示之前仍然要把所有数据取出来。

2.         重载GtkTreeModelget_value函数比较困难。麻烦在于GtkTreeModelIface是个接口,GtkListStore实现了它,它不像普通虚函数可以重载。对于glib接口,你只能去实现这个接口,而不能重载接口的一个函数。

 

对于第一个问题,我们做了些简化处理,因为我们列表中的所有项的高度及宽度一样,在size_request阶段调用get_value时,可以返回一个默认值,说以便GtkTreeView可以计算控件大小。

 

对于第二个问题,我们决定对GtkListStore扩展,而不是重载。让应用程序可以hookGtkListStoreget_value函数的调用。这很简单,设置一个回调函数就行了。

 

做了简单测试,证明此方案可行,但还需要进一步验证。此方案虽然可行,但不够优雅,不知道大家有什么好办法没有。

 

~~end~~

 

 

 

发表于 @ 2006年09月07日 21:19:00|评论(loading...)

新一篇: Linux电源管理研究笔记—acpid工作原理 | 旧一篇: 用GtkTreeView实现ListBox的示例

用户操作
[即时聊天] [发私信] [加为好友]
李先静
订阅我的博客
XML聚合  FeedSky
李先静的公告

BLOG评论请到


下载BLOG示例代码请先到上注册,谢谢。

文章分类
收藏
1.友情链接
0华清远见-嵌入式培训专家
aimself@CSDN(RSS)
directfb中文网站(RSS)
Eric's Little Hut
eye_of_back的专栏(RSS)
Linux Mobile Research
Phoenix@上海(RSS)
segments的专栏(RSS)
study's Blog(RSS)
tracestudio
伐木丁丁鸟鸣嘤嘤(RSS)
会飞的鱼的专栏(RSS)
创系的技术博客
小四的BLOG(RSS)
小马哥的博客(RSS)
开源电信(RSS)
御风剑客
新奇的BLOG
易军军的网络家
李吉群的专栏(RSS)
2.亲情链接
凤凰的幸福蓄水池(RSS)
我的相册
3.软界高手
Donald E. Knuth (RSS)
孟岩(RSS)
透明(RSS)
4.LinuxMobile
celinuxforum(RSS)
GPE(RSS)
maemo.org(RSS)
opensource.motorola
palowireless
5.XWindow
Jserv's blog(RSS)
Keith Packard(RSS)
6.技术资源
7.开源项目
freedesktop(RSS)
GNU(RSS)
GTK+(RSS)
matchbox(RSS)
pxa27x-linux/
8.我的BLOG镜像
absurd@chinaunix
absurd@msn
My English BLOG(RSS)
存档
Csdn Blog version 3.1a
Copyright © 李先静