android listview自动加载更多,如何实现 Android ListView『上拉加载更多』?

ListView上拉加载更多的UI需求

(1)向上滑动 ListView,当最后一个条目滚入屏幕时开始加载更多条目,在列表底部增加一个 footerView:一个 infinite progressBar,一个 textView 显示 “Loading...”;

(2)根据数据加载的结果更新 view:

(2.1)如果已经没有更多条目,则更新 footerView:仅包含一个 textView 显示“No More”;

(2.2)如果成功获取更多条目,则更新 ListView,同时移除(隐藏) footerView;

(2.3)如果加载失败(网络异常等原因),移除(隐藏) footerView。

综上述,需要有一个 footerView,它包含两种状态:

-------------------------------

| @ Loading... | (借用 @ 当做infinite progressBar)

-------------------------------

-------------------------------

| No More |

-------------------------------

这是一个挺简单 UI 需求,比常见的实现方式少了一种状态:

-------------------------------

| 查看更多 |

-------------------------------

在这种状态下,点击 footerView 也可以和『上拉』一样加载更多条目。我对比了手Q和微信,手Q就多了这个『查看更多』的状态(当然,必须在上拉时恰好让它停在最后一个条目,不然上拉过头后,就立刻变成『Loading...』)。

本需求并不需要这个状态,所以下面的实现分析不会考虑它,所以整体实现相对简单。

为了实现上述需求,需要考虑三个问题:

如何定义 footerView?

何时加载更多?

数据加载完毕后,如何更新视图?

如何定义 footerView?

如上述,footerView 包含两种状态:加载中、没有加载。

『加载中』包含两个控件,infinite progressBar 和 textView,放进一个 LinearLayout;『没有加载』只包含一个控件,textView,也把它放进一个 LinearLayout;然后把这两个 LinearLayout 放到一个 FrameLayout 内。根据状态决定显示哪个 LinearLayout。因此只需要一个 public method:

public class PullUpLoadListViewFooter extends LinearLayout {

public enum State {

LOADING,

NOT_LOADING,

}

public void updateView(State state, String content) {}

}

何时加载更多?

向上滑动 ListView,当最后一个条目滚入屏幕时开始加载更多条目。ListView 可以监听滚动事件,因此知道何时加载更多。但数据加载的工作显然应该交给控制器,也就是 ListView 的托管者比如 Activity 来完成。

所以,在 ListView 中定义一个接口,并在 ListView 滚动事件中回调这个接口方法:

public class PullUpLoadListView extends ListView {

public interface OnPullUpLoadListener {

void onPullUpLoading();

}

public void setOnPullUpLoadListener(OnPullUpLoadListener listener) {

mOnPullUpLoadListener = listener;

}

private OnPullUpLoadListener mOnPullUpLoadListener;

private OnScrollListener mOnScrollListener = new OnScrollListener() {

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

// Start a new loading when the last item scrolls into screen, instead of overriding method onTouchEvent.

// 检查是否到listView底部,检查callbacks是否注册:

if (needLoad(...)) {

startPullUpLoad();

}

}

};

}

startPullUpLoad() 是listView 处理上拉加载的核心代码:秀出显示『Loading...』的footerView;设置标志位表示『已经处于上拉加载状态中』防止重复加载;回调。

private void startPullUpLoad() {

if (mOnPullUpLoadListener != null) {

// Show the foot view and update its state to LOADING.

showFooterView();

// Set flag

mIsPullUpLoading = true;

// Call the callback to notify the listView's hosted controller to load data.

mOnPullUpLoadListener.onPullUpLoading();

}

}

再由 Activity 实现该接口完成加载工作:

listView.setOnPullUpLoadListener(new PullUpLoadListView.OnPullUpLoadListener() {

@Override

public void onPullUpLoading() {

if (shouldLoadMore) {

// Loading more data

new LoadDataAsyncTask().execute();

} else {

// Already has no more data

// 下面会讲到这个方法

listView.onPullUpLoadFinished(true);

}

}

});

数据加载完毕后,如何更新视图?

ListView 提供一个public方法,根据数据加载的结果更新视图:

public class PullUpLoadListView extends ListView {

// When loading finished, the controller should call this public method to update footer view.

public void onPullUpLoadFinished(boolean hasNoMoreItems) {

// Clear flag

mIsPullUpLoading = false;

if (hasNoMoreItems) {

// when have no more items, update footer view to: NO MORE

mFooterView.updateView(PullUpLoadListViewFooter.State.NOT_LOADING, FOOTER_VIEW_CONTENT_NO_MORE);

} else {

// The other cases: (1)Loading succeed and still has more items, (2)Loading failed,

// should hide footer view.

hideFooterView();

}

}

}

Activity 完成加载数据后,调用 ListView 提供的方法,并更新 adapter 数据集:

listView.onPullUpLoadFinished(false);

// Add more data to adapter and notify data set changed to update listView.

adapter.addMoreItems(newItems);

源码实现总结

(1)数据加载完成后,由PagingListView负责更新adapter,考虑到ListView可能并不清楚adapter的接口,所以还是交给activity比较好;

// PagingListView的实现

public void onFinishLoading(boolean hasMoreItems, List extends Object> {

...

((PagingBaseAdapter) adapter).addMoreItems(newItems);

}

(2)PagingListView维护了一个私有成员boolean hasMoreItems,然后在滚动事件回调onScroll(...)中,如果该值为false,就不会加载更多数据。

我觉得不应该由ListView来维护『是否具有更多的item』,这样会带来一些困惑和额外的工作。比如该值为false的情况下,当外部清空list item后,必须重置 hasMoreItems,否则无法继续加载。

这样逻辑显得比较乱,而『是否可以加载更多』,应该分成两部分:

由 ListView 判断『没有处于加载状态』并且『已经滚到了最后一个条目』则允许加载;

由 Activity 判断『还有更多的数据』则允许加载。

这样就显得清晰很多了。

如下的GIF演示了上拉加载的过程:

bVsaTZ

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

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

相关文章

android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...

唠叨几句:在移动端再开发的过程中,很容易使用到webview,它也是用来混合开发的中间桥梁,因此解决webview使用过程中出现的问题是非常有必要的;问题现象与发现:现象:日前,在是使用webview加载html…

android安全性发展,Android未来发展 安全是重点

自2008年首部Android手机问世以来,谷歌智能手机方面的发展也开始高歌勇进,经过近8年的发展,Android已经成为市场上最大的移动互联网操作系统,市场占有率位居第一,虽然其竞争对手iOS步步紧逼,但是由于Androi…

android 字符串调用方法名,AndroidJNI.CallStringMethod 调用字符串方法

AndroidJNI.CallStringMethod 调用字符串方法static function CallStringMethod (obj : IntPtr, methodID : IntPtr, args : jvalue[]) : stringDescription描述Calls an instance (nonstatic) Java method defined by methodID, optionally passing an array of arguments (ar…

android 服务器返回302,Android WebView 内处理302重定向不跳转的解决

最近项目中Webview加载第三方的具有302的重定向,但是却发现却没有重新跳转。最后发现问题如下:public boolean shouldOverrideUrlLoading(WebView view, String url) {super.shouldOverrideUrlLoading(view, url);.................return true&#xff…

c语言输入一个数求因数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#includemain(){int n,q,p,m,k1,sum0,s[99999]{2},t[99999];//n是输入的数;q和p分别代表两个数组的工作下标scanf("%d",&n); //k是用来取小于n数的数组工作下标for(int i3;i<n;i2) //去所有小于n的数&…

android手机rom简单制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼很多机友都在求精简系统&#xff0c;求ROOT等等....但不会怎么办&#xff1f;我来告诉大家一个完美无缺的办法&#xff01;授人以鱼不如授人以渔......蘑菇ROM助手&#xff1b;点击系统精简&#xff0c;导入刷机包。之后我们可以看…

android 邮件分享链接,Android应用从通过电子邮件发送的链接打开

我们的用户不时收到电子邮件.更改密码当他们点击链接时,我想将它们发送到我们的网站,但我们的Android应用程序被打开.链接例如是https://www.ourdomain.com/change-password/{random-string}.我们的应用程序中已经启用了深层链接,但配置方式如下&#xff1a;android:host"…

android excel布局,Android实现仿excel数据表格效果

在没给大家分享代码之前&#xff0c;先给大家展示下效果图&#xff1a;1.activity/*** 采购需求* Created by Administrator on 2016/10/13.*/public class PurchaseRequireActivity extends BaseActivity implements PurchaseRequireView {Bind(R.id.appTitle)TextView appTit…

android 页面整体滑动,ScrollView 实现页面整体滑动

页眉整体垂直方向滑动&#xff0c;xml文件较为简单&#xff0c;只需要在需要滑动的布局文件中包裹一层ScrollView就可以实现。示例&#xff1a;xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools"android:…

首款搭载鸿蒙os的设备,华为发布会配件汇总,首款搭载 鸿蒙OS 的设备来了

2020 年 10 月 30 日&#xff0c;华为召开 Mate40 系列发布会&#xff0c;正式发布 Mate40 系列手机。除了手机&#xff0c;本次发布会还发布了华为 Watch GT2 Pro 手表、华为 Sound 音箱等配件。以下是详细情况&#xff1a;华为智选智能摄像头 Pro该设备是首款搭载 HarmonyOS …

html 纵向选项卡,竖直选项卡式面板的实现_html/css_WEB-ITnose

前面的话&#xff1a;我是html的初学者&#xff0c;懂得一些html的基本知识。最近开始学css&#xff0c;不会JavaScript。了解到adobe dw cs5的插入->spry有选项卡式面板的设计&#xff0c;对这个很感兴趣。但是发现默认的是tab水平排列在上面的。然而多数网站都是tab竖直排…

超鸿蒙混希夷的翻译,对《愚溪诗序》一处译文的思考

《愚溪诗序》文末&#xff0c;柳宗元写道&#xff1a;“以愚辞歌愚溪&#xff0c;则茫然而不违&#xff0c;昏然而同归&#xff0c;超鸿蒙&#xff0c;混希夷&#xff0c;寂寥而莫我知也。”人教版教参对“寂寥”的翻译是“寂寞清静”&#xff0c;对“莫我知”的翻译是“没有谁…

html图片自动切换的幻灯片效果的,js带点自动图片轮播幻灯片特效代码分享

本文实例讲述了javascript带点自动图片轮播幻灯片特效。分享给大家供大家参考。具体如下&#xff1a;这是一款基于javascript实现带点自动图片轮播幻灯片特效代码&#xff0c;实现过程很简单。运行效果图&#xff1a;-------------------查看效果下载源码-------------------小…

省份城市区县三级联动html代码,基于Jquery实现省份、城市、区县三级联动

-//W3C//DTD HTML 4.01 Transitional//EN”“;>$(document).ready(function(){//省份城市数组var fujian_city new Array(‘福州’,’漳州’,’厦门’,’龙岩’,’泉州’,’南平’,’莆田’,’宁德’,’三明’);var guangdong_city new Array(‘广州’,’深圳’,’东莞’,…

html 页面元素id不唯一,规定html元素的唯一的id属性

实例通过 JavaScript 利用 id 属性来改变一段文本&#xff1a;function change_header(){document.getElementById("myHeader").innerHTML"Nice day!";}Hello World!Change text亲自试一试定义和用法id 属性规定 HTML 元素的唯一的 id。id 在 HTML 文档中必…

计算机网络硬件脆弱性,计算机网络的脆弱性有哪几点

计算机网络系统在设计、实施、应用和控制过程中存在的一切可能被攻击者利用从而造成安全危害的缺陷都是网络的脆弱性。佰佰安全网的专家顾问给出了这个问题的答案。计算机网络脆弱性(vulnerability)涉及一切信息系统或信息网络中可被非预期利用的方面。从整体上看&#xff0c;网…

Html百分比设宽偏差大,前端开发之移动端适配详细讲解

适配问题怎么适配iphone61px问题为什么页面与设计稿会出现偏差&#xff1f;dpr设备像素/ css像素&#xff0c;只有dpr等于1的时候&#xff0c;实际效果和设计稿的尺寸比例才是1:1。因为iPhone6的DPR(设备像素比)为2&#xff0c;设备像素为750&#xff0c;所以iPhone6的理想视口…

关于计算机网络的描述错误的是,【单选题】以下关于计算机网络定义的描述中,错误的是...

问题&#xff1a;【单选题】以下关于计算机网络定义的描述中&#xff0c;错误的是更多相关问题我省为了解决药品价格过高的问题&#xff0c;决定大幅度降低药品价格&#xff0c;其中将原价为a元的某种常用药降价40%&#xff0c;则降价后的今年五月份&#xff0c;由于H7N9禽流感…

计算机考研学科专业基础,2018考研计算机学科专业基础综合考试大纲

I考试性质计算机学科专业基础综合考试是为高等院校和科研院所招收计算机科学与技术学科的硕士研究生而设置的具有选拔性质的联考科目&#xff0c;其目的是科学、公平、有效地测试考生掌握计算机科学与技术学科大学本科阶段专业知识、基本理论、基本方法的水平和分析问题、解决问…

html5 image 同步,html5 image使用大全

html5 image使用大全发布时间&#xff1a;2020-06-06 06:29:13来源&#xff1a;51CTO阅读&#xff1a;768作者&#xff1a;hello_world007html>var p_w_picpathLoader {loaded:true,loadedImages:0,totalImages:0,load:function(url){this.totalImages;this.loaded false;…