Windows Phone 8中如何实现列表触底加载

【背景】

很多时候在做WP开发的过程中会遇到数据需要分页获取,根据微软官方的推荐方式,建议实现为Market中类似的体验,即滑动到列表的底部的时候加载更多的数据。

这一需求在早起WP7.1时代实现起来是很费劲的,需要借助WP Toolkit 中的LongListSelector,而自从LLS被微软扶正之后这一需求的实现有了更官方的方法。

【实现思路】

LLS传承了Listbox UI虚拟化的特性,所谓UI虚拟化即列表数据源中的数据不会一次性根据ItemTemplete将所有数据UI化,而是随着列表的滑动,随时将数据UI化,或者将UI化的数据释放掉。举例说明下更直观:

比如,LLS数据源中有1W条User类型的数据,记录用户信息。LLS负责展示这1W条数据。假设一屏能显示10条。那么UI虚拟化的工作就是:

1、将30条(举例的数据)User根据ItemTemplete绘制出对应的30个UI控件

2、向下滑动看到第20条数据的时候,从数据源中拿出20条绘制UI控件,并将前20条的绘制出来的控件释放掉。

3、向下滑动看到第40条数据的时候,再从数据源中拿出20条绘制UI控件,并将前20条绘制出来的控件释放掉。

4、往上滑动重新回到第20条数据的时候,反向再进行一次绘制和释放

以上UI虚拟化的概念了解后我们标题中的需求就很好实现了。

LLS定义了OnItemRealized事件,其作用简单说:当LLS根据ItemTemplete绘制UI控件时会触发此事件,通知用户当前绘制的是哪一个数据。

【具体代码分析】

根据这个定义我们实现的代码如下:

解释:

1、Offset 为距离数据源中最后一项的偏移量

2、IsLoading为依赖属性,标识当前正在加载数据

3、当OnItemRealized事件触发时,判断当前Realized的Item是否为数据源的倒数第二项,如果是,则认为需要加载新的数据,触发DataRequest事件

如此一个简单通用的"无尽列表"便实现了。

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/extra/

参考:

http://msdn.microsoft.com/library/windowsphone/develop/microsoft.phone.controls.longlistselector.itemrealized(v=vs.105).aspx

http://code.msdn.microsoft.com/wpapps/TwitterSearch-Windows-b7fc4e5e

完整代码见:

https://gist.github.com/tianhonghui/6999984

时间: 2024-11-03 11:41:04

Windows Phone 8中如何实现列表触底加载的相关文章

在dotnet4.0的webForm项目中,想用线程解决加载慢,服务器响应时间慢的问题

问题描述 在dotnet4.0的webForm项目中,想用线程解决加载慢,服务器响应时间慢的问题 在dotnet4.0的webForm项目中,想用线程解决加载慢,服务器响应时间慢的问题,但是发现我新开一个线程让他去加载数据的时候,他就获取不到HTTP请求了,请大侠们多多帮忙,小的感激不尽!谢谢大家! 解决方案 设置下超时,超时是不是太短了.

github-请问Jekyll博客中如何用相对路径来加载图片

问题描述 请问Jekyll博客中如何用相对路径来加载图片 请教关于Jekyll博客写的markdown文件,博文中怎么插入图片? 在_post下再键一个目录用来放置对应博文的图片,md中用相对目录表示,可是实际才显示不出来 又不想用绝对路径,请问该如何解决 万分感谢----

asp.net-急求:ASP.net中Web office插件,vs加载excel2013 调试时出现内存不足的问题

问题描述 急求:ASP.net中Web office插件,vs加载excel2013 调试时出现内存不足的问题 解决方案 如果不是系统兼容的问题 那就是office本身的问题 打开excel 文件-选项-信用中心-信用中心设置-受信用位置-添加新位置-注意勾选-"同时信任此位置的子文件夹"按确定 重启excel 文件阻止设置,找到你的Excel对应的版本,勾选打开

eclipse maven项目中一个war类型的项目加载进tomcat时,只加载了WEB-INF

问题描述 eclipse maven项目中一个war类型的项目加载进tomcat时,只加载了WEB-INF 我遇到这样一个问题,我有一个maven的项目,其中有一个war类型的子模块,当我想在tomcat7上面运行时,我查看了其下面的项目,发现仅仅是加载了WEB-INF文件夹里面只有classs文件也就是只有java跟resource中的东西没有webapp文件夹下的内容,甚至连其下面的web.xml文件都没有加载进来,JSP及其他文件夹都没有加载..

从Mysql中下载大附件时,一直加载,是不是需要设置一下mysql的配置文件

问题描述 从Mysql中下载大附件时,一直加载,是不是需要设置一下mysql的配置文件 文件可以上传成功,速度也还可以,小附件下载时速度还不错,但是大附件(大于10M)下载时一直 显示加载,是不是需要在mysql中设置一下配置文件 解决方案 大于10M的文件你都存数据库中啦?不慢才怪呢,建议楼主以后存储流媒体文件.等一下大的文件,只把文件所在本地的链接存入数据表中就可以了

javascript-js中如何让模板引擎先加载完毕,再调用页面里被模板包裹的id?

问题描述 js中如何让模板引擎先加载完毕,再调用页面里被模板包裹的id? 如题,刚学没多久,纯新手,可能问的有问题,我用js模板引擎包裹了一段html,但是发现包裹之后,再用其他js调用这段HTML中的id就调不出来了,只要把代码不放在模板包裹里就可以调用,如何解决,或者说先让模板加载完毕,在运行下一个js? 解决方案 你所谓的js模板引擎包裹的一段html,出现在body标签里而不是js里了吗? 说白了,你不把那段html放到页面,只在js里,其他js是取不到的 解决方案二: html页面 b

tfs2010用户-SQL Server Reporting Services 涉及到用户列表都无法加载

问题描述 SQL Server Reporting Services 涉及到用户列表都无法加载 解决方案 http://blog.csdn.net/hadstj/article/details/11178971

Windows 8 Store Apps学习(54) 绑定: 增量方式加载数据

介绍 重新想象 Windows 8 Store Apps 之 绑定 通过实现 ISupportIncrementalLoading 接口,为 ListViewBase 的增量加载提供数据 示例 实现 ISupportIncrementalLoading 接口,以便为 ListViewBase 的增量加载提供数据 Binding/MyIncrementalLoading.cs /* * 演示如何实现 ISupportIncrementalLoading 接口,以便为 ListViewBase 的增

Android中使用二级缓存、异步加载批量加载图片完整案例

一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络.内存缓存(一级)本质上是Map集合以key-value对的方式存储图片的url和Bitmap信息,由于内存缓存会造成堆内存泄露, 管理相对复杂一些,可采用第三方组件,对于有经验的可自己编写组件,而文件缓存比较简单通常自己封装一下即可.下面就通过案例看如何实现网络图片加载的优化. 二.案例介绍 案例新