今天跟大家分享的是大麦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 滚动底部自动加载后续数据的更多相关文章

  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. Linux 文件压缩、打包

    文件压缩 计算机使用byte单位来计量.实际上,计算机最小的计量单位是bit.1byte = 8 bit.如果记录1这个数字,00000001,1会在最右边占一个1个bit 其他7个bit会被填上0. ...

  2. SpringMVC(下)

    一.访问静态资源 在进行Spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL 在设置url-pattern时可以设置三种形式 (1)/* :拦截所有 ...

  3. eos的资源和工具列表

    1.eos买rex的时候同时获得投票收益: https://b1.run/eosproxy eos的投票衰减规则: Block.one 希望确保用户经常更新他们的投票设定,而不是设置完就不管了.为了促 ...

  4. PhpStorm 头部注释、类注释和函数注释的设置(稍微完善点)

    首先,PhpStorm中文件.类.函数等注释的设置在:setting->Editor->FIle and Code Template->Includes下设置即可,其中方法的默认是这 ...

  5. 如何使用Salt Pillar

    作者言 Salt的网站上有两篇关于Pillar的文档(一,二),其中一篇内容很少,我觉得写成一篇文章更合适.本文的逻辑结构没有参照官方文档,而是根据我自己对Pillar的理解组织内容,希望能够把这个概 ...

  6. checkbox与label内的文字垂直居中的解决方案

    <label style="float:left;margin-top:5px;margin-left:10px;cursor:pointer"><input t ...

  7. postgres开启慢查询日志

    1.全局设置修改配置postgres.conf: log_min_duration_statement=5000 然后加载配置: postgres=# select pg_reload_conf() ...

  8. JS执行——Promise

    https://www.jianshu.com/p/b16e7c9e1f9f Promise Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大.它最早由社 ...

  9. Python3基础 sys.path 查看与修改导包的路径

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  10. matlab学习笔记8 基本绘图命令-三维绘图

    一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...