Xamarin.Forms: 无限滚动的ListView(懒加载方式)

说明

在本博客中,学习如何在Xamarin.Forms应用程序中设计一个可扩展的无限滚动的ListView。这个无限滚动函数在默认的Xamarin.Forms不存在,因此我们需要为此添加插件。在这里我们需要知道无限滚动时如何工作的。首先,显示固定的数据。一旦用户滚动到末尾,我们可以在列表的末尾添加更多的数据,这样,列表就会不断滚动,直到数据结束。

让我们开始吧

第一步

创建一个新的Xamarin.Forms工程,打开Visual Studio,点击新建->项目->在对话框中选择移动应用(Xamarin.Forms),并点击下一步**

(未使用原文图片)

第二步

接下来,出现一个新的对话框,在这里给出应用程序和解决方案的名称,名字为:XFInfiniteScroll,然后点击创建(未使用原文图片)

第三步

之后,在新的对话框窗口中,选择你的Xamarin.Forms应用模板类型和平台之后点击确定,在这里,我选择选项卡式模板和Android,iOS平台。因为这里选择空模板时,没有成功,改选用选项卡模板(未使用原文图片)

第四步

在项目创建完成之后,安装Xamarin.Forms.Extended.Infinitescrolling NuGet包。右键点击解决方案并选择管理解决方案的NuGet程序包,注:需要选中包括预发行版选项

第五步

现在,在项目XFInfiniteScroll 选中Models文件夹,右击添加一个类,名称为:InfiniteItems,代码如下:

namespace XFInfiniteScroll.Models
{public class InfiniteItems{public string Id { get; set; }public string Text { get; set; }public string Title { get; set; }public string Description { get; set; }}
}

第六步

继续在项目XFInfiniteScroll中,添加一个文件夹,名称为:FakeDataSource,在文件夹中添加一个相当于提供模拟数据的类,名称为:InfiniteDataItems,代码如下(占用空间较大,已删除,可以在Github上面阅读源码)

第七步

由于本项目采用的是选项卡模板,并且目前已使用Shell方式(可以参考:Xamarin.Forms Shell。修改AppShell.xaml文件代码如下:

    <TabBar><Tab Title="Infinite Scroll" Icon="icon_about.png"><ShellContent Title="Single"><local:SingleViewPage></local:SingleViewPage></ShellContent><ShellContent Title="Group"><local:GroupViewPage></local:GroupViewPage></ShellContent></Tab><ShellContentTitle="About"ContentTemplate="{DataTemplate local:AboutPage}"Icon="icon_about.png"Route="AboutPage" /><ShellContentTitle="Browse"ContentTemplate="{DataTemplate local:ItemsPage}"Icon="icon_feed.png" /></TabBar>

此处,对于TabbedPage的用法出现错误,因此只能采用此种方法处理页面的布局

在文件夹Views中分别添加SingleViewPageGroupViewPage内容页。直接在下面图片中修改文件名即可。

SingleViewPage页面布局

<?xml version="1.0" encoding="utf-8" ?>
<ContentPagex:Class="XFInfiniteScroll.Views.SingleViewPage"xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:extended="clr-namespace:Xamarin.Forms.Extended;assembly=Xamarin.Forms.Extended.InfiniteScrolling"BackgroundColor="Red"><ContentPage.Content><ListViewx:Name="ListSingleItems"HasUnevenRows="True"HorizontalOptions="FillAndExpand"VerticalOptions="FillAndExpand"><ListView.Behaviors><extended:InfiniteScrollBehavior IsLoadingMore="{Binding IsWorking}"></extended:InfiniteScrollBehavior></ListView.Behaviors><ListView.ItemTemplate><DataTemplate><ViewCell><Grid Padding="12"><Grid.RowDefinitions><RowDefinition Height="20" /><RowDefinition Height="20" /></Grid.RowDefinitions><Label Grid.Row="0" Text="{Binding Text}"></Label><Label Grid.Row="1" Text="{Binding Description}"></Label></Grid></ViewCell></DataTemplate></ListView.ItemTemplate><ListView.Footer><Grid Padding="6"><LabelHorizontalOptions="Center"IsVisible="{Binding IsWorking}"Text="Loading..."VerticalOptions="Center"></Label></Grid></ListView.Footer></ListView></ContentPage.Content>
</ContentPage>

GroupViewPage页面布局

<?xml version="1.0" encoding="utf-8" ?>
<ContentPagex:Class="XFInfiniteScroll.Views.GroupViewPage"xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:extended="clr-namespace:Xamarin.Forms.Extended;assembly=Xamarin.Forms.Extended.InfiniteScrolling"><ContentPage.Content><ListViewx:Name="GroupItems"HasUnevenRows="True"HorizontalOptions="FillAndExpand"IsGroupingEnabled="True"VerticalOptions="FillAndExpand"><ListView.Behaviors><extended:InfiniteScrollBehavior IsLoadingMore="{Binding IsWorking}" /></ListView.Behaviors><ListView.ItemTemplate><DataTemplate><ViewCell><Grid Padding="12"><Grid.ColumnDefinitions><ColumnDefinition Width="*"></ColumnDefinition></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="20"></RowDefinition><RowDefinition Height="20"></RowDefinition></Grid.RowDefinitions><LabelGrid.Row="0"Text="{Binding Text}"TextColor="Black"></Label><LabelGrid.Row="1"Text="{Binding Description}"TextColor="Black"></Label></Grid></ViewCell></DataTemplate></ListView.ItemTemplate><ListView.GroupHeaderTemplate><DataTemplate><ViewCell Height="25"><Grid BackgroundColor="White"><LabelFontAttributes="None"FontSize="16"HorizontalTextAlignment="Center"Text="{Binding Header}"TextColor="Blue"VerticalTextAlignment="Center"></Label></Grid></ViewCell></DataTemplate></ListView.GroupHeaderTemplate><ListView.Footer><Grid Padding="6"><LabelHorizontalOptions="Center"IsVisible="{Binding IsWorking}"Text="Load..."TextColor="Black"VerticalOptions="Center"></Label></Grid></ListView.Footer></ListView></ContentPage.Content>
</ContentPage>

对于后台代码,可以在GitHub上面参考。https://github.com/mzy666888/XFInfiniteScroll

第八步

现在,可以运行你的Xamarin.Forms应用程序,并可以看到以下的输出内容。在本机上运行界面:视频地址(可以查看下一条的视频)或者移步到:https://www.zhihu.com/zvideo/1338425998501240832

看一下原文中的动图显示

由于iOS & Android运行结果动图的帧数超过300帧,上传失败,需要看的可以移步到知乎查看


— END —

「扩展阅读」

[GitHub] 75+的 C# 数据结构和算法实现

谁说.NET不适合搞BD,ML、AI

推荐一个集录屏、截图、音频于一体的软件给大家

10个用于C#.NET开发的基本调试工具

Xamarin.Forms 二维码扫描实践

在Asp.Net Core MVC 开发过程中遇到的问题总结

前端小白在asp.net core mvc中使用ECharts

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

[译]如何在C#中调试LINQ查询

C# 语言性能提升方法

使用MQTTnet搭建Mqtt服务器

OxyPlot在WinForm中的应用

「公众号推荐」

回复:「redis」 获取5.0.9版的Windows安装包(exe)

回复:「ca」 获取  截图、GIF等工具三件套,便携版和安装版全部包括

回复:「新书」 获取《ASP.NET Core 3框架揭秘》购书链接

回复:「cv」 获取《OpenCV 4快速入门》购书链接

回复:「进阶」 获取 《CLR via C#(第4版)》购书链接

回复:「本质论」获取 《C# 7.0本质论》购书链接

回复:「WPF」获取 WPF 电子书

「加号主回复”入群“」即可加入群聊



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb应用开发与实践pdf_基于阿里云打造「云原生」Web应用——「懒猪行」Web应用开发实践...

作者&#xff1a;阿里云MVP 刘远程背景『懒猪行』专注于境外自由行S2B业务&#xff0c;涉及分销、终端用户服务、供应链等多个服务环节&#xff0c;随着业务规模的不端增加&#xff0c;我们一直在探索Web应用开发的最佳实践&#xff0c;以加快Web应用的迭代效率&#xff0c;为B…

python大型项目中的日志模块_Python中日志模块的使用

前言程序和脚本往往是无人值守运行的&#xff0c;一旦发生问题&#xff0c;就需要我们去追溯当时的情况来定位问题的原因。这便需要我们在程序和脚本中引入日志的功能。相比于print信息&#xff0c;使用logging日志有以下优点可以记录输出日志的时间、文件、函数以及代码行&…

OSI强调:SSPL并不是开源许可证

喜欢就关注我们吧&#xff01;日前&#xff0c;开放源代码促进会 OSI&#xff08;Open Source Initiative&#xff09;强调&#xff0c;SSPL 并不是一个开源许可证。OSI 表示&#xff0c;SSPL&#xff08;Server Side Public License&#xff09; 是一种典型的 “fauxpen”&…

.NET Remoting

轉自:http://www.iiiedu.org.tw/knowledge/knowledge20030430_2.htm.NET Remoting 資策會數位教育研究所講師 董淑惠     概念簡介 微軟以往使用COM/DCOM的技術來處理分散式系統架構&#xff0c;透過Client端的Proxy代理程式來呼叫遠端Server機器上的物件。.NET Framework則…

通过python实现linux切换用户_Python操作远程服务器切换到root用户

在自动化运维过程中&#xff0c;需要远程服务器切换到root用户下执行命令&#xff0c;尝试了一些方法&#xff0c;得到如下好用的方法&#xff0c;供大家使用&#xff1a; import time import paramiko def verification_ssh(host,username,password,port,root_pwd,cmd): spara…

RabbitMQ 入门:1. Message Broker(消息代理)

Message Broker&#xff08;消息代理&#xff09;维基百科对 Message Broker 的定义是&#xff1a;Message broker是一种中介程序模块&#xff0c;它把消息从发送方的正式消息传递协议转化为接收方的正式消息传递协议。这个定义略繁琐&#xff0c;下面看看 RabbitMQ 官网对 Mes…

什么时候我们应谈及性能?

【导读】实际项目开发中、有部分童鞋可能无时无刻都在关注性能&#xff0c;那么我们到底应该什么时候关注性能呢&#xff1f;个人以为&#xff0c;性能并非一次性就可完全成全&#xff0c;需结合实际业务有一个大致评估或预期&#xff0c;比如数据量大小&#xff0c;若预期短暂…

python编写正则表达式匹配单词_Python正则表达式匹配整个单词

守候你守候我 我认为&#xff0c;通过给出的答案&#xff0c;OP所期望的行为并没有完全实现。具体来说&#xff0c;布尔值的期望输出没有完成。给出的答案做帮助说明这一概念&#xff0c;我认为他们是优秀的。也许我可以说明我的意思&#xff0c;我认为OP使用了下面的例子。给出…

python中可以表示任意大的整数_Python无法表示99999999999999999999这样大的整数。

被邓为“小平和国一部意义义的具有际意称赞法律历史&#xff0c;无法”的性的一个具有杰作创造“是是(。表示。对于的容性要密封求高器&#xff0c;样整数包括性试验的要求中应进行气密各种。无法喷涂金属及工具有设备。吊装台起用多重机设备时&#xff0c;表示为(吊装用的常采…

[转]简单介绍如何用Reporting Service制作报表

1&#xff09; 在安装好Reporting Service后&#xff0c;打开Visual studio .net ,选择新建项目&#xff0c;选择建立商业智能项目&#xff0c;选择新建一个报表项目&#xff0c;命名为reportservice1,再选确定&#xff0c;如下图&#xff1a; 2&#xff09;之后&#xff0c;在…

freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...

不用说&#xff0c;Spring已经成为Java后端开发的事实上的行业标准。无数公司选择Spring作为基本开发框架。大多数Java后端程序员在日常工作中也会接触到Spring。因此&#xff0c;如何很好地使用Spring&#xff0c;已成为Java程序员的必修课之一。同时&#xff0c;Spring Boot和…

MS-SQLSERVER--错用了LEN()函数

sqlserver数据导入oracle时发现字符长度不对。。下面是两个函数的区别&#xff1a;DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符&#xff08;而不是字节&#xff09;个数&#xff0c;其中不包含尾随空格转载于:https://www.cnblogs.com/yooplmqj/…

rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

原文托管在Github: https://github.com/shellhub/blog/issues/52数据结构与算法之线性表-顺序表实现(C语言版本)前言数据结构与算法是一个程序员必备的技能之一,而顺序表更是每个程序员在面试过程中要经常被问到的&#xff0c;如Java语言中的ArrayList类的底层实现就是使用顺序…

hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读

安装Hadoop软件系列&#xff0c;首选Linux系统&#xff0c;比如Ubuntu。如果你的系统是Windows&#xff0c;建议再安装一个Ubuntu&#xff0c;组成双系统&#xff0c;如此可以发挥各自系统的特点。使用U盘制作一个系统&#xff0c;拿出一块分区用作新装的系统&#xff0c;开机启…

后宫佳丽三千,假如古代皇帝也懂负载均衡算法...

古代皇帝&#xff0c;后宫佳丽三千&#xff0c;没法做到雨露均沾&#xff0c;但为了繁衍后代&#xff0c;子嗣繁盛&#xff0c;弱水三千&#xff0c;只取一瓢饮显然是不行的。不同的朝代有不同的宠幸妃子的方法&#xff0c;著名的有羊车望幸、掷筛侍寝、翻牌悬灯等等。如果皇帝…

mac 配置php和mysql_Mac下配置PHP+MySql环境

由于最近需要布置mantis用来进行bug追踪&#xff0c;在此记录其过程。由于PHP apache环境在Mac OS上是自带的&#xff0c;所以不需要另处下安装包&#xff0c;只需要简单配置一下即可。首先打开终端输入命令&#xff1a;sudo vim /etc/apache2/httpd.conf其中有一行是这样的#Lo…

git使用的基本流程_git命令的基本使用

首先下载完git之后打开Git Bash配置你的邮箱和用户名&#xff08;github或gitee&#xff09;&#xff1a;$ git config --global user.name "注册时账号的名字"$ git config --global user.email "注册时使用的邮箱"获取ssh公钥&#xff1a;ssh-keygen -t …

Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言

还记得五年前的夏天&#xff0c;我在巨硬写着世界上最好的语言&#xff0c;有时也需要带着游标卡尺写着另一门语言。然而&#xff0c;我对这两门语言都不熟悉&#xff0c;如果能在 VS Code 中方便快捷地运行各种语言&#xff0c;那岂不是很方便&#xff1f;于是&#xff0c;我就…

mysql group where_[MySQL] 测试where group by order by的索引问题

1. select * from test where axx group by b order by c 如何加索引CREATE TABLE index_test (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL DEFAULT ,gid int(11) NOT NULL DEFAULT 0,age int(11) NOT NULL DEFAULT 0,PRIMARY KEY (id)) ENGI…

gpl可以商用吗_一文看懂开源许可证,能不能商用再也不抓瞎

在github中闲逛&#xff0c;宝藏多福利好。不过心里或许总有小忐忑&#xff0c;这么多开源项目&#xff0c;我的产品里能不能用呀&#xff01;其实想知道项目能不能用看下项目的开源许可证就清楚了(即使是非软件产品比如数据、媒体、资料等也可以通过开源许可证知道它们的可用范…