ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式。目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验。

对于ListView和GridView一个共同的需求就是在用户不断向下滚动,组件仍能动态的加载更多地加载更多数据。这篇博客就将带领大家实现在ListView和GridView中这个功能。

我们需要的主要组件就是我们的InfiniteScrollListener类,这个类是继承于OnScrollListener,就让我们来看下具体的代码实现:

public abstract class InfiniteScrollListener implements AbsListView.OnScrollListener {
private int bufferItemCount = 10;
private int currentPage = 0;
private int itemCount = 0;
private boolean isLoading = true; public InfiniteScrollListener(int bufferItemCount) {
this.bufferItemCount = bufferItemCount;
} public abstract void loadMore(int page, int totalItemsCount); @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// Do Nothing
} @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if (totalItemCount < itemCount) {
this.itemCount = totalItemCount;
if (totalItemCount == 0) {
this.isLoading = true; }
} if (isLoading && (totalItemCount > itemCount)) {
isLoading = false;
itemCount = totalItemCount;
currentPage++;
} if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) {
loadMore(currentPage + 1, totalItemCount);
isLoading = true;
}
}
}
// Attach the listener to the AdapterView onCreate
yourListView.setOnScrollListener(new InfiniteScrollListener(5) {
@Override
public void loadMore(int page, int totalItemsCount) {
List<HashMap<String, String>> newData = loader.loadData();
dataList.addAll(newData);
adapter.notifyDataSetChanged();
}
});

如上,我们已经将这个类作为抽象类,这是一个很好的设计。我们的InfiniteScrollListener类实现了onScroll()方法,但是没有实现loadMore(),而是又给实现类来实现。

onScroll()方法在我们滚动时,程序会自动调用。所以我们推荐在这个方法里,不要进行过重的处理和数据计算,因为滚动是很频繁,这个方法调用也是很频繁的。

为了实现这个效果,我们只需要在实现InfiniteScrollListener,并将这个实现类设置给ListView/GridView的setOnScrollListener()方法,就像是第二个代码片段的匿名类。

我们实现了InfiniteScrollListener类,我们也需要实现loadMore()方法,在这个方法里,我们可以给ListView/GridView添加Item并通过notifyDataSetChanged()通知ListView/GridView数据发生改变。当然我们可以手动添加本地数据,也可以l从数据库或者RESTful service来Load更多的数据。

这就是我们在Android中实现的在ListView/GridView的可以无限滚动的所作的。对于有大量信息,ListView/GridView无疑有着很好的出处用户体验。

原文:http://www.avocarrot.com/blog/implement-infinitely-scrolling-list-android/

[Android]如何实现无限滚动的ListViw/GridView(翻译)的更多相关文章

  1. Android 高级UI设计笔记09:Android如何实现无限滚动列表

    ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...

  2. Android 高级UI设计笔记09:Android实现无限滚动列表

    1. 无限滚动列表应用场景: ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们 ...

  3. Android实现ViewPager无限循环滚动回绕

     Android实现ViewPager无限循环滚动回绕 Android系统提供的ViewPager标准方式是左右可以自由滑动,但是滑动到最左边的极限位置是第一个page,滑动到最右边的位置是最后一 ...

  4. LoopBar – Tap酒吧与无限滚动

    相约 LoopBar – 标签栏与无限滚动为Android由Cleveroad 在Cleveroad我们最近认识到通过使用任何一个应用程序类别的导航,导航面板是很无聊和琐碎.这就是为什么我们的设计师的 ...

  5. Xamarin自定义布局系列——支持无限滚动的自动轮播视图CarouselView

    背景简述 自动轮播视图(CarouselView)在现在App中的地位不言而喻,绝大多数的App中都有类似的视图,无论是WebApp还是Native App.在安卓.iOS以及Windows(UWP) ...

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

    说明 在本博客中,学习如何在Xamarin.Forms应用程序中设计一个可扩展的无限滚动的ListView.这个无限滚动函数在默认的Xamarin.Forms不存在,因此我们需要为此添加插件.在这里我 ...

  7. iOScollectionView广告无限滚动(Swift实现)

    今天公司里的实习生跑过来问我一般App上广告的无限滚动是怎么实现的,刚好很久没写博客了,就决定写下了,尽量帮助那些处于刚学iOS的程序猿. 做一个小demo,大概实现效果如下图所示: 基本实现思路: ...

  8. Infinite Scroll - jQuery & WP 无限滚动插件

    无限滚动(Infinite Scroll)也称为自动分页.滚动分页和无限分页.常用在图片.文章或其它列表形式的网页中,用来在滚动网页的时候自动加载下一页的内容.Infinite Scroll  这款  ...

  9. [Unity3D插件]2dtoolkit系列二 动画精灵的创建以及背景图的无限滚动

    经过昨天2dtoolkit系列教程一的推出,感觉对新手还有有一定的启发作用,引导学习使用unity 2dToolKit插件的使用过程,今天继续系列二——动画精灵的创建,以及背景图的无限循环滚动,在群里 ...

随机推荐

  1. 在spring中映射X.hbm.xml文件的小技巧

    通常在spring中会这么写代码: <bean id="sessionFactory" class="org.springframework.orm.hiberna ...

  2. windows 目录空格

    Window下安装Scala出现:此时不应有 \scala\bin\..\lib\jline-2.14.5.jar 原因很简单,scala默认安装到了Program Files (x86)文件夹下,目 ...

  3. shutdown的几种方式,shutdown abort的一些弊端有哪些

    1.shutdown normal     正常方式关闭数据库. 2.shutdown immediate     立即方式关闭数据库.     在SVRMGRL中执行shutdown immedia ...

  4. jdk 版本不一致导致的错误

    平时做项目时难免会从git,svn下载代码或者把别人的项目文件导入到自己的MyEclipse中进行操作,因此会遇到很多问题,常见的有一种是使用的jdk版本不一致造成的报错, 错误案例:     错误提 ...

  5. 使用PXE安装CentOS7

    1.环境 本文使用VMware 虚拟机进行实验. 点击VMware--编辑--虚拟网络编辑器,新建VMnet15,选择仅主机模式,取消勾选DHCP服务(因为这里使用自己的DHCP服务).我这里配好后是 ...

  6. caioj1230: [图论补充]哈密顿路径

    保存模版 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> ...

  7. HDU1087 Super Jumping! Jumping! Jumping! —— DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limi ...

  8. 并不对劲的bzoj1861: [Zjoi2006]Book 书架

    传送门-> 这题的正确做法是splay维护这摞书. 但是并不对劲的人选择了暴力(皮这一下很开心). #include<algorithm> #include<cmath> ...

  9. luogu 4720 【模板】扩展卢卡斯

    题目大意: 求$C_n^m \mod p$,p不一定为质数 思路: 首先可以将$p$分解为$p1^{a1}*p2^{a2}*...*pk^{ak}$,对于这些部分可以使用$CRT$合并 对于每个$p_ ...

  10. Hibernate对集合属性的操作---基础学习

    1:Set集合属性操作 1).Hibernate3以后支持大部分重要的JDK集合接口映射,Set集合接口的配置:  >在xxx.hbm.xml文件中使用<set>标签 2).< ...