分享大麦UWP版本开发历程-03.GridView或ListView 滚动底部自动加载后续数据
今天跟大家分享的是大麦UWP客户端,在分类、订单或是搜索时都用到的一个小技巧,技术粗糙大神勿喷。
以大麦分类举例,默认打开的时候,会为用户展示20条数据,当用户滚动鼠标或者使用手势将列表滑动到倒数第二行的位置时,自动加载后续20条数据。提高启动速度的同时稍稍节省用户的流量。

其他的就不说了,直接进入代码阶段。
Step1,界面部分很简单,我放弃了Gridvew自己的滚动,在外面包上了一个ScrollViewr,监听ViewChanged事件(这样代码比较简单,直接用GridView内部的数据变化那种方式,必须给GridView一个高度等等,麻烦)
<ScrollViewer x:Name="scrollRoot" VerticalScrollBarVisibility="Hidden" ViewChanged="scrollRoot_ViewChanged" Margin="10,0">
<GridView>
……
</GridView>
</ScrollViewer/>
Step2,修改绑定界面的ViewModel,增加一个同样结构的列表属性,但是要使用ObservableCollection,利用这个集合的可变性以及自动通知界面,方便的动态通知列表,有数据更新。
using System.Collections.Generic;
using System.Collections.ObjectModel; namespace Damai.Windows10.App
{
/// <summary>
/// 搜索页面ViewModel
/// </summary>
public class SearchViewModel
{
private List<SearchResultModel> _l; /// <summary>
/// 项目列表
/// </summary>
public List<SearchResultModel> l
{
get
{
return _l;
}
set
{
_l = value;
if (_l == null) return;
if (list == null) list = new ObservableCollection<SearchResultModel>();
foreach (var item in _l)
{
list.Add(item);
}
}
} /// <summary>
/// 用于数据绑定列表
/// </summary>
public ObservableCollection<SearchResultModel> list { get; set; }
}
}
Step3,接下来该怎么初始化,怎么查询第一波数据(当然了,这个需要咱们服务器端的同学支持,如果他接口不允许分页查询,咱们做客户端的也没辙 ),初始化数据以后,在当前页面保存住这个ViewModel,并把它绑定到GridView控件上。
// 加载数据
private async Task<bool> LoadData()
{
try
{
// 你自己的业务逻辑
// 获取数据并展示
_searchViewModel = new SearchViewModel();
_searchViewModel = await HttpConnectionTool.GetDataEntity<SearchViewModel>(TempDataInfo.MakeApiURL(url));
if (_searchViewModel == null || _searchViewModel.l == null || _searchViewModel?.l?.Count <= )
{
// 异常数据处理
} // 绑定数据(一定绑定是那个ObservableCollection属性的列表)
gridViewProject.ItemsSource = _searchViewModel.list; // 加载完成后,触发事件 return true;
}
catch (Exception ex)
{ return false;
}
}
Step4,处理鼠标滚动事件
// 滚动至底部动态加载数据
private async void scrollRoot_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
if (scrollRoot.VerticalOffset == _originHeight) return;
_originHeight = scrollRoot.VerticalOffset; if (_isLoding) return;
if (scrollRoot.VerticalOffset <= scrollRoot.ScrollableHeight - ) return;
if (_currentPage >= _countPage + ) return; _isLoding = true;
await Task.Factory.StartNew(async () =>
{
//调用UI线程添加数据
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
// 拼接业务查询URL // 查询新数据
SearchViewModel tempViewModel = await HttpConnectionTool.GetDataEntity<SearchViewModel>(TempDataInfo.MakeApiURL(url));
if (tempViewModel != null && tempViewModel.l != null) _searchViewModel.l = tempViewModel.l;
_isLoding = false;
});
});
}
好了,搞定打完收工!
分享大麦UWP版本开发历程-03.GridView或ListView 滚动底部自动加载后续数据的更多相关文章
- 分享大麦UWP版本开发历程-01.响应式轮播顶部焦点图
话说有一天,临近下班无心工作,在网上看各种文章,阅读到了一篇名为<聊聊大麦网UWP版的首页顶部图片联动效果的实现方法>(传递:http://www.cnblogs.com/hippieZh ...
- 分享大麦UWP版本开发历程-02.内容“高度/宽度”不同的列表展示
一个成型的产品,肯定是经过了产品经理出的UE,美工设计的UI,最终到我们手里Coding,这里面最少3个人,最多就不知道会有多少人参与了.每个人脑子想的都是不一样的,我就不粘贴那个“XX眼中的XX”那 ...
- Android PullToRefresh (GridView 下拉刷新上拉加载)
做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/And ...
- 移除 WordPress 自动加载的 jQuery,使用自定义 jQuery 版本
WordPress 使用的 jQuery 版本由于需要考虑到很多安全稳定的因素,所以一般不会使用最新版本的 jQuery, 可以通过以下方式移除 WordPress 自定加载的 jQuery,并加载自 ...
- uni-app开发经验分享十四:小程序超过2M限制的方法——分包加载
起初小程序上线时,微信限制了代码包不能超过1MB,后来功能变大变成了2M了,限制大小是出于对小程序启动速度的考虑,希望用户在使用任何一款小程序时,都能获得一种"秒开"体验.但是 ...
- C# 不同版本切版时,方法不支持,加载对应dll, 相关Dll的资源
不过,有些高版本有的DLL,低版本运行时,需要引用相关DLL.我们不用在网上去下载 下面的路径,查找对应版本下的DLL,可能会给你意想不到的收获哦 C:\Program Files\Reference ...
- thrift的php-v0.12版本类自动加载失败
参考网上教程,使用$loader->registerDefinition('Sample', $GEN_DIR); 但是会报PHP Fatal error: Uncaught Error: C ...
- 关于GridView的第一个item图片加载不出来问题
首先感谢csdn里的id 大神了没 的博客 地址:http://blog.csdn.net/wenyiqingnianiii/article/details/39291667 原因在positi ...
- 01-05-01-2【Nhibernate (版本3.3.1.4000) 出入江湖】立即加载实现--NHibernateUtil.Initialize()和添加fetch关键字的HQL查询
相关资料: http://www.cnblogs.com/lyj/archive/2008/10/29/1322373.html 问题的提出: 1.延迟加载,可能会引起session已经关闭的异常,例 ...
随机推荐
- SQL语句操作数据试题
1.在SQL Server中,下列关于数据完整性的说法错误的是(). (选择一项) A:实体完整性要求表中的每一行数据都反映不同的试题,不能存在相同的数据行 B:域完整性是只给定列的输入有效性 C:在 ...
- SSH框架整合2
===========================================web.xml================================================== ...
- Confd+Consul 动态生成配置文件
一.Consul安装和配置 1.consul是什么? consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性: 服务发现:Consul客户 ...
- 为什么Map桶中个数超过8才转为红黑树
这是笔者一个好友面试阿里时,被问及的一个问题,应该不少人看到这个问题都会一面懵逼.因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什么当链表长度为8的时候才做转换动作.笔者第一反应 ...
- SSM项目实战 之 权限管理系统
目录 SSM权限管理系统 项目搭建 1.创建Maven-webapp工程 2.SSM框架集成 3.添加代码生成器 主页搭建 EasyUI主页 员工列表 1.在tree当中指定跳转的地址--暂时用tre ...
- 请简述web开发中的兼容问题
1,浏览器默认的内外边距不一样,所以用通用选择器*设置margin和padding来设置.2,块标签设置浮动后,有设置margin的情况下,在ie6下的margin比别的浏览器大.3,img标签会有默 ...
- sci会议和sci期刊区别是什么
sci会议和sci期刊区别是什么?从名称上来看就很明显了,一个是学术会议,一个是学术期刊,是不同的学术研究载体,不论是会议论文还是期刊论文,都是受认可的,就目前来看,发表期刊论文的作者要偏多一些,主要 ...
- 关于js.map以及css.map
什么是source map文件. source map文件是js文件压缩后,文件的变量名替换对应.变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下. 比如压缩后原变量是m ...
- 调用百度API接口 正解析地址和逆解析
地址解析(结构化地址 解析得到 经纬度): public void SaveLocation(DataRequest<Location> request, DataResponse< ...
- what's the RTP协议
what's the RTP RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期 ...