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,一经查实,立即删除!

相关文章

Lucifer的一场暴强围英雄表演

http://w3g.replays.net/doc/cn/2008-4-9/12077828953425064279.html围所欲围

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則…

jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼url增加参数useSSL 和时区 : jdbc:mysql://localhost:3306/mydb?useSSLfalse&serverTimezoneUTCdriver变化: com.mysql.jdbc.Driver > com.mysql.cj.jdbc.Driver常见错误提示1&#xff1a;如果driver没有添加cj&#xff0c…

通过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…

ASP.NET中常用输出JS脚本的类(改进版)

在ASP.NET中我们经常需要输出一些JS脚本&#xff0c;比如弹出一个警告窗口&#xff0c;返回到历史页面等JS功能&#xff0c;我看到网上流传得比较广的是马先光写的一个JScript类&#xff0c;这个类基本将经常用到的JS脚本包含了&#xff0c;非常方便&#xff0c;唯一的不足是作…

mysql从库夯住_MySQL从库维护经验分享

前言&#xff1a;MySQL 主从架构应该是最常用的一组架构了。从库会实时同步主库传输来的数据&#xff0c;一般从库可以作为备用节点或作查询使用。其实不只是主库需要多关注&#xff0c;从库有时候也要经常维护&#xff0c;本篇文章将会分享几点从库维护经验&#xff0c;一起来…

python frame用法_python—dataframe用法

#行处理 #df.iloc[1] 行索引号——获取行 #df.iloc[0,1] 行列索引号——获取一个元素 #df.iloc[[0,1]] 双括号默认都是行索引号——获取n行 #df.iloc[0:2,1:3] 行列索引号——获取区域元素 #df.loc["A"] 行名称——获取行 #df.loc["A","c1"] 行列…

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

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

基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历

http://blog.csdn.net/dongfengsun/archive/2007/12/12/1930577.aspx 上次用J2SE写了一个文件夹传递工具,把所有文件都以字节流的形式写入到一个*.txt文件里。结果回到家后,光分目录筛选文件就浪费了我整整一个晚上。痛定思痛,决定还是从程序上来解决问题。 那么所有的磁盘文件…

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

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

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

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

数据写入规则IBufferWriterT

IBufferWriter<T>从名字上看大概已经猜到作用&#xff0c;这个接口是在.NET Standard 2.1作为标准支持。那这个接口的实际使用场和作用是什么&#xff1f;在了解之前先看一下System.Text.Json的一些代码:public sealed class Utf8JsonWriter : IAsyncDisposable, IDispos…

[转]简单介绍如何用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和…

adonis.js mysql_Adonis.js——数据库基本操作

一、配置数据库adonis支持 PostgreSQL&#xff0c;SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;Oracle&#xff0c;MSSQL 数据库&#xff0c;默认为SQLite。在 config/database 中修改配置。connection: Env.get(DB_CONNECTION, mysql),二、创建数据库模型(Model)λ…

C# ObservableCollection和List的区别

一、ObservableCollection和List的区别1&#xff09;ObservableCollection比较简单&#xff0c;继承了Collection, INotifyCollectionChanged, INotifyPropertyChangedCollection&#xff1a;为泛型集合提供基类。INotifyCollectionChanged&#xff1a;将集合的动态更改通知给侦…