分享大麦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 <= 0)
                {
                   // 异常数据处理
                }                

                // 绑定数据(一定绑定是那个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 - 500) return;
            if (_currentPage >= _countPage + 1) 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;
                });
            });
        }

好了,搞定打完收工!

时间: 2024-08-10 20:50:25

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

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

话说有一天,临近下班无心工作,在网上看各种文章,阅读到了一篇名为<聊聊大麦网UWP版的首页顶部图片联动效果的实现方法>(传递:http://www.cnblogs.com/hippieZhou/p/4755290.html),看到别人评论自己做的产品,顿时来了兴趣,阅读过后,hippieZhou童鞋基本把这个自动轮播控件的原理精髓都讲到了,我就在这里,顺着Zhou同学的文章,接着分享一下更细节一点的东西. 今天要跟大家分享的,就是这个简单的控件,在响应式布局里面做的工作.其中有用过微软提供的X

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

一个成型的产品,肯定是经过了产品经理出的UE,美工设计的UI,最终到我们手里Coding,这里面最少3个人,最多就不知道会有多少人参与了.每个人脑子想的都是不一样的,我就不粘贴那个“XX眼中的XX”那个图了.这次讲的是,遇到这么一个情况,项目列表在小屏幕状态下,因为项目的特殊描述在项目描述框里面放不下(一堆字都挤到一起了),产品经理和美工一商量,“嗯,如果屏幕过小就直接放在项目概要块的下面,而且有描述的显示,没描述的不显示”.开始我以为是一件很简单的事情,加几个判断就完了,后来才发现我是多么的

Android LRecyclerView 操作案例分享-实现下拉刷新、滑动到底部自动加载

一直想抽空写下这个开源项目,但是各种原因没有抽时间,今天还是趁着工作间隙写下了这篇博客,与大家分享. 简介 LRecyclerView是支持addHeaderView. addFooterView.下拉刷新.分页加载数据的RecyclerView. 它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView.FooterView,并且不需要对你的Adapter做任何修改. 主要功能 下拉刷新.滑动到底部自动加载下页数据: 可以方便添加Header和Foot

thinkphp3.2.2版本,公共函数放哪里才能自动加载?

在原来的项目里面有个common/common.php, 里面放的就是些function,之前能在任何地方直接使用, 现在报错不能使用, 公用函数库文件放置在Application应用模块根目录下的Common模块下的Common目录下即可(./Application/Common/Common/function.php),其他模块直接调用该公用函数文件的函数,命名空间都不需要 thinkphp3.2.2版本,公共函数放哪里才能自动加载?,布布扣,bubuko.com

GridView+下拉刷新+上拉加载

一.布局 1.activity_main布局 <?xml version="1.0" encoding="UTF-8"?> <pull_grid.PullToRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/refresh_view" android:layout_width=&q

读取网上gson数据,展示到gridview上,然后上拉加载,下拉刷新

NetWorkUtil.class package com.example.liangminghui20160425; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpC

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

做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/Android-PullToRefresh) activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

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

WordPress 使用的 jQuery 版本由于需要考虑到很多安全稳定的因素,所以一般不会使用最新版本的 jQuery, 可以通过以下方式移除 WordPress 自定加载的 jQuery,并加载自定义的 jQuery // Remove default jquery function custom_jquery_enqueue() { if( !is_admin()){ wp_deregister_script('jquery'); // 移除默认加载的 jQuery wp_register

metronic 4.5.7开发环境下, 在Windows 10上安装了10.16.0版本的node js之后,导致node sass无法加载

解决办法: 修改metronic 中的package.json文件, 将gulp-sass的依赖项版本改为3.2.1即可解决 { "name": "metronic", "version": "4.5.7", "description": "Metronic by Keenthemes", "main": "gulpfile.js", "