今天跟大家分享的是大麦UWP客户端,在分类、订单或是搜索时都用到的一个小技巧,技术粗糙大神勿喷。

以大麦分类举例,默认打开的时候,会为用户展示20条数据,当用户滚动鼠标或者使用手势将列表滑动到倒数第二行的位置时,自动加载后续20条数据。提高启动速度的同时稍稍节省用户的流量。

其他的就不说了,直接进入代码阶段。

Step1,界面部分很简单,我放弃了Gridvew自己的滚动,在外面包上了一个ScrollViewr,监听ViewChanged事件(这样代码比较简单,直接用GridView内部的数据变化那种方式,必须给GridView一个高度等等,麻烦)

  1. <ScrollViewer x:Name="scrollRoot" VerticalScrollBarVisibility="Hidden" ViewChanged="scrollRoot_ViewChanged" Margin="10,0">
    <GridView>
    ……
    </GridView>
    </ScrollViewer/>

Step2,修改绑定界面的ViewModel,增加一个同样结构的列表属性,但是要使用ObservableCollection,利用这个集合的可变性以及自动通知界面,方便的动态通知列表,有数据更新。

  1. using System.Collections.Generic;
  2. using System.Collections.ObjectModel;
  3.  
  4. namespace Damai.Windows10.App
  5. {
  6. /// <summary>
  7. /// 搜索页面ViewModel
  8. /// </summary>
  9. public class SearchViewModel
  10. {
  11. private List<SearchResultModel> _l;
  12.  
  13. /// <summary>
  14. /// 项目列表
  15. /// </summary>
  16. public List<SearchResultModel> l
  17. {
  18. get
  19. {
  20. return _l;
  21. }
  22. set
  23. {
  24. _l = value;
  25. if (_l == null) return;
  26. if (list == null) list = new ObservableCollection<SearchResultModel>();
  27. foreach (var item in _l)
  28. {
  29. list.Add(item);
  30. }
  31. }
  32. }
  33.  
  34. /// <summary>
  35. /// 用于数据绑定列表
  36. /// </summary>
  37. public ObservableCollection<SearchResultModel> list { get; set; }
  38. }
  39. }

Step3,接下来该怎么初始化,怎么查询第一波数据(当然了,这个需要咱们服务器端的同学支持,如果他接口不允许分页查询,咱们做客户端的也没辙 ),初始化数据以后,在当前页面保存住这个ViewModel,并把它绑定到GridView控件上。

  1. // 加载数据
  2. private async Task<bool> LoadData()
  3. {
  4. try
  5. {
              // 你自己的业务逻辑
  6. // 获取数据并展示
  7. _searchViewModel = new SearchViewModel();
  8. _searchViewModel = await HttpConnectionTool.GetDataEntity<SearchViewModel>(TempDataInfo.MakeApiURL(url));
  9. if (_searchViewModel == null || _searchViewModel.l == null || _searchViewModel?.l?.Count <= )
  10. {
  11. // 异常数据处理
  12. }
  13.  
  14. // 绑定数据(一定绑定是那个ObservableCollection属性的列表)
  15. gridViewProject.ItemsSource = _searchViewModel.list;
  16.  
  17. // 加载完成后,触发事件 return true;
  18. }
  19. catch (Exception ex)
  20. { return false;
  21. }
  22. }

Step4,处理鼠标滚动事件

  1. // 滚动至底部动态加载数据
  2. private async void scrollRoot_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
  3. {
  4. if (scrollRoot.VerticalOffset == _originHeight) return;
  5. _originHeight = scrollRoot.VerticalOffset;
  6.  
  7. if (_isLoding) return;
  8. if (scrollRoot.VerticalOffset <= scrollRoot.ScrollableHeight - ) return;
  9. if (_currentPage >= _countPage + ) return;
  10.  
  11. _isLoding = true;
  12. await Task.Factory.StartNew(async () =>
  13. {
  14. //调用UI线程添加数据
  15. await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
  16. {
  17. // 拼接业务查询URL
  18.  
  19. // 查询新数据
                SearchViewModel tempViewModel = await HttpConnectionTool.GetDataEntity<SearchViewModel>(TempDataInfo.MakeApiURL(url));
  20. if (tempViewModel != null && tempViewModel.l != null) _searchViewModel.l = tempViewModel.l;
  21. _isLoding = false;
  22. });
  23. });
  24. }

好了,搞定打完收工!

分享大麦UWP版本开发历程-03.GridView或ListView 滚动底部自动加载后续数据的更多相关文章

  1. 分享大麦UWP版本开发历程-01.响应式轮播顶部焦点图

    话说有一天,临近下班无心工作,在网上看各种文章,阅读到了一篇名为<聊聊大麦网UWP版的首页顶部图片联动效果的实现方法>(传递:http://www.cnblogs.com/hippieZh ...

  2. 分享大麦UWP版本开发历程-02.内容“高度/宽度”不同的列表展示

    一个成型的产品,肯定是经过了产品经理出的UE,美工设计的UI,最终到我们手里Coding,这里面最少3个人,最多就不知道会有多少人参与了.每个人脑子想的都是不一样的,我就不粘贴那个“XX眼中的XX”那 ...

  3. Android PullToRefresh (GridView 下拉刷新上拉加载)

    做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/And ...

  4. 移除 WordPress 自动加载的 jQuery,使用自定义 jQuery 版本

    WordPress 使用的 jQuery 版本由于需要考虑到很多安全稳定的因素,所以一般不会使用最新版本的 jQuery, 可以通过以下方式移除 WordPress 自定加载的 jQuery,并加载自 ...

  5. uni-app开发经验分享十四:小程序超过2M限制的方法——分包加载

      起初小程序上线时,微信限制了代码包不能超过1MB,后来功能变大变成了2M了,限制大小是出于对小程序启动速度的考虑,希望用户在使用任何一款小程序时,都能获得一种"秒开"体验.但是 ...

  6. C# 不同版本切版时,方法不支持,加载对应dll, 相关Dll的资源

    不过,有些高版本有的DLL,低版本运行时,需要引用相关DLL.我们不用在网上去下载 下面的路径,查找对应版本下的DLL,可能会给你意想不到的收获哦 C:\Program Files\Reference ...

  7. thrift的php-v0.12版本类自动加载失败

    参考网上教程,使用$loader->registerDefinition('Sample', $GEN_DIR); 但是会报PHP Fatal error:  Uncaught Error: C ...

  8. 关于GridView的第一个item图片加载不出来问题

    首先感谢csdn里的id   大神了没  的博客 地址:http://blog.csdn.net/wenyiqingnianiii/article/details/39291667 原因在positi ...

  9. 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已经关闭的异常,例 ...

随机推荐

  1. ranger整合kerberos

    一.生成主体 在kerberos服务器生成用于ranger的用户主体: # kadmin.local addprinc -randkey HTTP/manager1@HADOOP.COM addpri ...

  2. 【CSP模拟赛】Freda的迷宫(桥)

    题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过.  黄昏 ...

  3. Alpha3

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11899921.html 作业博客 :https://edu.cnblogs.com/campus/f ...

  4. bookdown - 撰写和发表自己的网络书籍/文档

    BOOKDOWN官网 - bookdown上有不少人发布了自己的电子书 bookdown-demo (一个demo,github源码)- Rstudio出品,Yihui Xie开发,著名单细胞课程在用 ...

  5. 共线性图 | Alluvial Diagrams | Parallel plot | Parallel Coordinates Plot

    最近有个需求需要画如下的图: 这些图的核心意思是一样的,就是connection,把不同的数据连到一起. 文章里把这图叫做共线性图,是按功能命名的,Google里搜不到. 搜到类似的,这个图叫 Par ...

  6. Layui 点击查询分页,页码不刷新解决方法

    Layui 点击查询分页,页码不刷新解决方法 function queryDataGrid() { layui.table.reload(tableName, { where: { //设定异步数据接 ...

  7. Freemarke

    本文介绍了freemarker的集成.FTL指令.内建函数.运算符等常用操作. 1.为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类 ...

  8. CentOS7 安装特定版本的Docker

    先卸载旧版本   sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-late ...

  9. 【linux基础】Ubuntu16.04桌面突然卡住怎么办?

    使用Ctrl+Alt+F1先进入命令行模式,然后根据问题进行相应的操作. re 1. Ubuntu16.04桌面突然卡住怎么办; 2. Ubuntu下图形界面卡死解决办法; end

  10. Procedural Mesh Component in C++:Getting Started

    转自:https://wiki.unrealengine.com/Procedural_Mesh_Component_in_C++:Getting_Started I create a simple ...