毕设遇到的问题(二)---gridview viewholer
开始写第二篇了
关于GridView的问题
毕设写的是课程管理,这样需要一个weekview来显示一周所有的课程,国外已经有一个很好的应用叫TimeTable,虽然我的也叫timetable哈,但差距远了。因为好奇给开发者发了一封邮件,没想到开发者挺热情回复了我。在他和stackoverflow的帮助下,gridview的问题也解决了。
问题是这样的,一开始把所有的数据读取操作放在了getview里面,这无疑是自杀的行为,卡顿不是一般的。。。后来通过google稍微解决了一点卡顿的问题,但还是有那么些。是用异步来读取所有lesson 放在一个数组里面,然后getview根据position就可以很快的拿到了。
但是卡顿还是存在,于是去stackoverflow找,结果没找到,可能是因为英文关键词用的不对吧。然后就提问了,老外直接给我一个很长的文档,说复用convertView。地址在这http://www.vogella.com/articles/AndroidListView/article.html 找到了viewholder, 说convertView 要复用,因为每次findviewbyid也是相当耗时的。找到需要的地方,赶紧改代码啊。改完之后打开weekview 后果真流畅了不少,可是有一个大麻烦来了。就是gridview的显示问题,各种错乱。在csdn上有人说convertview不能复用,会导致显示错乱的问题,但是在gridview中很明显要使用viewholder pattern 才能解决卡顿的问题显然不靠谱。。。继续google,关于girdview的文章实在太少了。
仔细想了想,根据position 来get item是没错的,为何会出现其他的grid item会显示本不该显示的内容呢? 这因该是复用convertview的问题,继续google gridview getview的工作原理,说是position=0时候convertview是null, 但是以后的话就显示上一次return 的convertview了。如果是这样也就不难理解为什么会出现错乱的现象了。
解决方案 就是不断的重置viewholder中各种view的值。免得返回的convertview是上一个item的内容。这样确实也起到了作用。完美解决(可能是完美吧)。
ps:从db中读数据确实太慢,88个格子,执行一遍要2~3秒。这个速度难怪直接在getview中从数据库中get会卡顿勒。