前言


最近几天在研究上拉加载啊,下拉刷新啊什么的。然而坑爹的事情总是那么多。在xamarin.forms中,list自带的,并没有上拉加载的这个属性(难道当初他们封装方法时,就不会想到数据多了会咋整吗?)抱怨归抱怨,问题总是要解决的。

既然没有,那就自己写一个喽~

思路


我的思路是这样的,

什么是上拉刷新,那是不是就是说,在当前页面,看到最后一个item的时候,我需要加载一些新的数据,那我是不是可以写一个,只要出现了最后一个item我们就去刷新最新数据呢?

 public class InfiniteListView : ListView
{
public static readonly BindableProperty LoadMoreCommandProperty = BindableProperty.Create(nameof(LoadMoreCommand), typeof(ICommand), typeof(InfiniteListView));
public static readonly BindableProperty CanLoadMoreProperty = BindableProperty.Create(nameof(CanLoadMore), typeof(bool), typeof(InfiniteListView), true); public ICommand LoadMoreCommand
{
get { return (ICommand)GetValue(LoadMoreCommandProperty); }
set { SetValue(LoadMoreCommandProperty, value); }
} public bool CanLoadMore
{
get
{
return (bool)GetValue(CanLoadMoreProperty);
}
set
{
SetValue(CanLoadMoreProperty, value);
}
} public InfiniteListView()
{
ItemAppearing += InfiniteListView_ItemAppearing;
} private void InfiniteListView_ItemAppearing(object sender, ItemVisibilityEventArgs e)
{
if (!CanLoadMore)
{
return;
}
var items = ItemsSource as IList; if (items != null && e.Item == items[items.Count - ])
{
if (LoadMoreCommand != null && LoadMoreCommand.CanExecute(null))
LoadMoreCommand.Execute(null);
}
}
}

我们来继承listview,来实现它的ItemAppearing方法,然后再方法里一次次的判断有没有到最后一个item(说实话我不知道这对程序好不好,现在只是想到了实现),只要出现了最后一个item,就去执行绑定方法。

在页面绑定中,需要

<ContentPage
xmlns:common="clr-namespace:XXX.Common;assembly=XXX"
>
<common:InfiniteListView
CanLoadMore="{Binding IsLoadMore}"
LoadMoreCommand="{Binding LoadMoreLogCommand}"> </common:InfiniteListView>

So。。其实是不是很简单?

简单测试了一下,发现了一个问题。就是我的list数据,有分组,一个list里面可能会有多个list,那最后一个item岂不是永远都是最外层的数据了?我把方法简单的改了一下

 private void GroupInfiniteListView_ItemAppearing(object sender, ItemVisibilityEventArgs e)
{
if (!CanLoadMore)
{
return;
}
if (ItemsSource == null)
{
return;
}
var items = ItemsSource as IList;
var itemSourceCouunt = items.Count;
var iindex = ;
IList lastData = ItemsSource as IList;
do
{
iindex++;
var lastItem = (items[items.Count - iindex]) as IList;
if (lastItem.Count > )
{
lastData = lastItem;
continue;
}
} while (itemSourceCouunt == iindex);
//foreach (var item in lastItem)
//{
// if (item is IList)
// {
// var data = item as IList;
if (lastData.Count <= )
{
return;
}
if (lastData != null && e.Item == lastData[lastData.Count - ])
{
if (LoadMoreCommand != null && LoadMoreCommand.CanExecute(null))
LoadMoreCommand.Execute(null);
// }
//}
//continue;
}
}

为了实现这个东西,其实费了我不少功夫(其实我真不知道xamarin.forms哪里省事省时间了)

关于xamarin.forms 中 list 的loadmore的更多相关文章

  1. Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别

    今天对Xamarin.Forms中的ListView的两个事件(ItemTrapped和ItemSelected)做了小小的研究,发现有以下几点区别: 1.ItemTrapped事件会优先被触发. 2 ...

  2. Xamarin Forms中WebView的自适应高度

    在Xamarin.Forms中,WebView如果嵌套在StackLayout和RelativeLayout中必须要设置HeightRequest和WidthRequest属性才会进行渲染.可是在实际 ...

  3. xamarin forms中的Button文本默认大写

    问题来源 使用xamarin forms创建的android项目中,Button.Toolbar的右侧菜单按钮上的如果是字母的话,在android5.0以上,默认的文本都是大写,这种情况iOS项目不存 ...

  4. Xamarin XAML语言教程Xamarin.Forms中构建进度条

    Xamarin XAML语言教程Xamarin.Forms中构建进度条 ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度条总是水平放置的.本节将讲解如何使用进度条. 注意:进度条在 ...

  5. Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

    Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的: ...

  6. Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏

    Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏 开发者除了可以在XAML中使用IsRunning属性控制指示器的显示隐藏外,还可以在代码隐藏文件中使用IsRunnin ...

  7. Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)

    Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一) 在Xamarin.Forms中,提供了两个控件用来指示程序的状态和进度.他们分别为活动指示器和进度条.其中,活动指示器 ...

  8. Xamarin.Forms中为WebView指定数据来源Source

    Xamarin.Forms中为WebView指定数据来源Source   网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebVi ...

  9. Xamarin.Forms中 Navigation,NavigationPage详解

    1.Xamarin Forms下有四个成员类:Element,VisualElement,Page,NavigationPage 基类为Element,继承的子类分别是VisualElement,Pa ...

随机推荐

  1. xcode模拟器不显示键盘解决方案

    当我们使用Xcode进行开发的时候,并不是所有的时候都需要将代码运行在iPhone,有时候模拟器就可以解决这些问题, 但是当你使用模拟器的时候会发现,在TextFiled中输入信息时,如果你是用模拟器 ...

  2. [ASP.NET MVC] Razor 布局

    整体视图模板 View模板会先找到对应的controller文件,再找此文件下的Shared文件夹. 比如项目最外层的View/Shared 目录下有一个_Layout.cshtml模板页,有这样代码 ...

  3. 数据库学习任务四:数据读取器对象SqlDataReader、数据适配器对象SqlDataAdapter、数据集对象DataSet

    数据库应用程序的开发流程一般主要分为以下几个步骤: 创建数据库 使用Connection对象连接数据库 使用Command对象对数据源执行SQL命令并返回数据 使用DataReader和DataSet ...

  4. MySQL (七)--视图、数据库备份和还原

    1 视图 视图:View,是一种有结构(有行有列)但是没结果(结构中不真实存放的数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源). 示例脚本: CREATE TA ...

  5. 个人作业3——个人总结(Alpha阶段)

    个人总结 Alpha阶段总结: 起初关于手机app的开发真的一无所知,选了一条较远的路走(使用 Android Studio 来开发 Android 应用更加方便,而我们选用 Eclipse 开发 A ...

  6. 【Alpha】第四次Daily Scrum Meeting

    GIT 一.今日站立式会议照片 二.会议内容 1.采取老师提出的建议,考虑对送礼对象进行一个分类,这个在服务功能模块中完善. 2.回顾之前几次会议的内容,做一个小的总结,各抒己见,对每个人哪方面做得比 ...

  7. 201421123059 http://www.cnblogs.com/deng201421123059/

    201421123059 http://www.cnblogs.com/deng201421123059/

  8. 团队作业4——第一次项目冲刺(ALpha版本)第三天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 完成了前端的HTML页面设计 2.功能 完成了后端数据处理的全部基本功能: 数据结构设计及数据交互操作 博客页面数据 ...

  9. 201521123047 j第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 参考资料: 百度脑图 XMind 2. 书面作业 1.代码阅读:Child压缩包 ...

  10. 201521123086 《Java程序设计》第9周学习总结

    本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. (1)使用try...catch语句捕获异常(try块后可跟一个或多个catch块,注意子类异常要放在父类异常前面,否则子 ...