在我们实际的业务需求中,如果是数据比较多,我们一般是采用分页请求,然后在客户端进行分页展示。这里笔者使用了一个叫LoadMoreWrapper这个分页加载框架,使用起来很方便,基本上不用去对RecyclerView的Adapter进行什么操作。

1、添加依赖

首先我们在app中的 build.gradle中添加对应的依赖:

//LoadMoreWrapper,可以为RecyclerView设置分页加载

implementation 'com.github.nukc:loadmorewrapper:v1.7.0'

另外我们在主工程的build.gradle中的allprojects中做如下改动

maven { url "https://jitpack.io" }

看源码

public class LoadMoreWrapper {

private final LoadMoreAdapter mLoadMoreAdapter;

public LoadMoreWrapper(LoadMoreAdapter loadMoreAdapter) {

mLoadMoreAdapter = loadMoreAdapter;

}

public static LoadMoreWrapper with(RecyclerView.Adapter adapter) {

LoadMoreAdapter loadMoreAdapter = new LoadMoreAdapter(adapter);

return new LoadMoreWrapper(loadMoreAdapter);

}

public LoadMoreWrapper setFooterView(@LayoutRes int resId) {

mLoadMoreAdapter.setFooterView(resId);

return this;

}

public LoadMoreWrapper setFooterView(View footerView) {

mLoadMoreAdapter.setFooterView(footerView);

return this;

}

public View getFooterView() {

return mLoadMoreAdapter.getFooterView();

}

public LoadMoreWrapper setNoMoreView(@LayoutRes int resId) {

mLoadMoreAdapter.setNoMoreView(resId);

return this;

}

public LoadMoreWrapper setNoMoreView(View noMoreView) {

mLoadMoreAdapter.setNoMoreView(noMoreView);

return this;

}

public View getNoMoreView() {

return mLoadMoreAdapter.getNoMoreView();

}

public LoadMoreWrapper setLoadFailedView(@LayoutRes int resId) {

mLoadMoreAdapter.setLoadFailedView(resId);

return this;

}

public LoadMoreWrapper setLoadFailedView(View view) {

mLoadMoreAdapter.setLoadFailedView(view);

return this;

}

public View getLoadFailedView() {

return mLoadMoreAdapter.getLoadFailedView();

}

/**

* 监听加载更多触发事件

* @param listener {@link com.github.nukc.LoadMoreWrapper.LoadMoreAdapter.OnLoadMoreListener}

*/

public LoadMoreWrapper setListener(LoadMoreAdapter.OnLoadMoreListener listener) {

mLoadMoreAdapter.setLoadMoreListener(listener);

return this;

}

/**

* 设置是否启用加载更多

* @param enabled default true

*/

public LoadMoreWrapper setLoadMoreEnabled(boolean enabled) {

mLoadMoreAdapter.setLoadMoreEnabled(enabled);

if (!enabled) {

mLoadMoreAdapter.setShouldRemove(true);

}

return this;

}

/**

* 设置全部加载完后是否显示没有更多视图

* @param enabled default false

*/

public LoadMoreWrapper setShowNoMoreEnabled(boolean enabled) {

mLoadMoreAdapter.setShowNoMoreEnabled(enabled);

return this;

}

/**

* 设置加载失败

*/

public void setLoadFailed(boolean isLoadFailed) {

mLoadMoreAdapter.setLoadFailed(isLoadFailed);

}

/**

* 获取原来的 adapter

*/

public RecyclerView.Adapter getOriginalAdapter() {

return mLoadMoreAdapter.getOriginalAdapter();

}

public LoadMoreAdapter into(RecyclerView recyclerView) {

recyclerView.setAdapter(mLoadMoreAdapter);

return mLoadMoreAdapter;

}

}

可以看到通过本类提供的with方法,LoadMoreWrapper能够实现对Adapter的装饰。里面有很多方法,都有注释,所以我们需要实现的功能用起来也很方便。

3.具体使用

LoadMoreWrapper.with(generateAdapter)

.setFooterView(R.layout.item_load_more)//底部view

.setNoMoreView(R.layout.item_load_complete)//没有更多的提示

.setLoadFailedView(R.layout.item_load_failed)//加载失败的提示

.setShowNoMoreEnabled(true)

.setListener(new OnLoadMoreListener() {

@Override

public void onLoadMore(LoadMoreAdapter.Enabled enabled) {

loadMoreEnabled = enabled;

presenter.getData(new PageParmForm(Constant.key,Constant.limit,Constant.order,Constant.page,Constant.sidx),NetWorkActivity.this);

}

})

.into(mRecyclerView);

使用起来也是很简单的,我们只需要对请求所得到的数据进行判断,然后对请求页码进行自增,就可以实现分页加载显示。

@Override

public void showApplicationList(UserGuideSoftConfigRForm> Response) {

data=Response.getData();

if(pageIndex == 1){

generateAdapter.setData(data);//直接显示当前页得items

generateAdapter.notifyDataSetChanged();//更新数据

}else{//页码不为1得时候

generateAdapter.addData(data);

}

//页码设置,每次获取到数据后,先判断数据集合是否不为空,如果不为空就先使得页码加一,然后下次获取数据的时候再进行判断

//直到如果数据为空的时候就显示没有更多数据了

if(data.size() > 0){

pageIndex ++;

Constant.page = pageIndex;

}else{

//没有更多数据了

loadMoreEnabled.setLoadMoreEnabled(false);//停止加载更多数据

generateAdapter.notifyItemChanged(generateAdapter.getData().size());//更新指定位置,Adapter一般有得到数据和设置数据

}

}

当没有数据的时候我们要调用

generateAdapter.notifyItemChanged(generateAdapter.getData().size());//更新指定位

可能有人会问为什么是generateAdapter.getData().size()而不是generateAdapter.getData().size() -1呢,是因为在没有数据可以展示的时候,提示View会占一个Item,只有这样,这个提示Item才会生效。

这样就实现了分页加载与显示了。

RecyclerView.PNG

改进与问题

在使用LoadMoreWrapper时,笔者进行了一番改动,结果发现在调用

generateAdapter.notifyItemChanged(generateAdapter.getData().size());是出现了一下错误:

Called attach on a child which is not detached: ViewHolder{40e612c0 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}

自己摸索了半天最终找到了解决方案:

1.第一步:

((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(true);

2.第二步:

我们直接生命一个LoadMoreAdapter,便于在操作过程中对他进行各种设置

private LoadMoreAdapter mLoadMoreWrapper;

...

//设置分页加载器

mLoadMoreWrapper = LoadMoreWrapper.with(generateAdapter)

.setFooterView(R.layout.item_load_more)//底部view

.setNoMoreView(R.layout.item_load_complete)//没有更多的提示

.setLoadFailedView(R.layout.item_load_failed)//加载失败的提示

.setLoadMoreEnabled(true)

.setShowNoMoreEnabled(isShowMore)//是否显示没有更多提示页

.setListener(new OnLoadMoreListener() {

@Override

public void onLoadMore(LoadMoreAdapter.Enabled enabled) {

loadMoreEnabled = enabled;//enable为引用

//调用业务

presenter.getData(new PageParmForm(Constant.key,Constant.limit,Constant.order,Constant.page,Constant.sidx),NetWorkActivity.this);

}

})

.into(mRecyclerView);

...

@Override

public void showApplicationList(UserGuideSoftConfigRForm> Response) {

data=Response.getData();//得到应用列表

if(pageIndex == 1){

generateAdapter.setData(data);//直接显示当前页得items

}else{

//页码不为1得时候

generateAdapter.addData(data);

}

if( data.size()<10 && pageIndex == 1 )

{

//停止加载更多

mLoadMoreWrapper.setShowNoMoreEnabled(false);

loadMoreEnabled.setLoadMoreEnabled(false);//停止加载更多数据

}else if(data.size()>0){

pageIndex ++;

Constant.page = pageIndex;

loadMoreEnabled.setLoadMoreEnabled(true);//加载更多数据

}else {

//没有更多数据了

loadMoreEnabled.setLoadMoreEnabled(false);//停止加载更多数据

mLoadMoreWrapper.setShowNoMoreEnabled(true);

generateAdapter.notifyItemChanged(generateAdapter.getData().size());//更新指定位置,Adapter一般有得到数据和设置数据

}

}

这样就解决了这个问题,而且对这个Wrapper能达到比较好的控制效果。

Android新浪微博分页加载,使用LoadMoreWrapper为RecyclerView实现分页加载相关推荐

  1. 手把手教你实现Android RecyclerView上拉加载功能

    心灵鸡汤:知之者不如好之者,好之者不如乐之者. 摘要 一直在用到RecyclerView时都会微微一颤,因为一直都没去了解怎么实现上拉加载,受够了每次去Github找开源引入,因为感觉就为了一个上拉加 ...

  2. 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

    文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...

  3. android 自定义域名,Android基于Retrofit2改造的可设置多域名的网络加载框架

    Android基于Retrofit2改造的可设置多域名的网络加载框架 1.使用说明 添加仓库 ``` allprojects { repositories { google() jcenter() m ...

  4. Android 使用腾讯的TBS浏览器X5内核的集成加载pdf等文件

    我们正常项目使用原生webview加载h5页面也是没问题的,但是当使用原生webview加载h5出问题了,h5地址在微信等可以正常使用,前端就会丢锅给我们,为了杜绝不是我们Android的问题,那我们 ...

  5. Android插件化学习之路(一)之动态加载综述

    前段时间,公司项目完成了插件化的开发,自己也因此学习了很多Android插件化的知识,于是想把这些内容记录下来,本次带来Android插件化的第一篇:动态加载综述 Android插件化学习之路(一)之 ...

  6. Android框架之路——Glide加载图片(结合RecyclerView、CardView)

    Android框架之路--Glide加载图片 一.简介: 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开 ...

  7. android music player实现一个可随机/顺序播放的可加载专辑图片的音频播放器(MediaPlayer)

    音乐播放器 1. 媒体交互框架 1. 服务端 2. 客户端 3. 两端消息交互 2. 播放模式 1. 单曲循环和整体循环 2. 随机播放和顺序播放 3. 几个问题: 1. 合并播放模式 2. 播放指定 ...

  8. Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置

    前言 此音频架构梳理笔记.主要是因工作上需要在 Android8.1 以上版本中,增加 snd-aloop 虚拟声卡做前期准备工作, 本篇文章提纲挈领的把音频框架主线梳理清晰,通过这篇文章能够清晰如下 ...

  9. 专为Android加载图片Fresco:详细图解SimpleDraweeView加载图片基础

    Fresco简单的使用-SimpleDraweeView 百学须先立志-学前须知: 在我们平时加载图片(不管是下载还是加载本地图片-..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该 ...

  10. 【05】Android时时监测手机的旋转角度 根据旋转角度确定在什么角度加载竖屏布局 在什么时候加载横屏布局

    一.场景描述: 近期开发中遇到个问题,就是我们在做横竖屏切换的功能时,横竖屏布局是操作系统去感知的,作为开发员没法确定Activity在什么时候加载横屏布局,在什么时候加载竖屏布局.因此为了找到加载横 ...

最新文章

  1. 中国一线城市住宅地价同比增幅连续8个季度收窄
  2. kaka 1.0.0 重磅发布,服务于后端的事件领域模型框架。
  3. boost::type_erasure::less_than_comparable相关的测试程序
  4. 还没搞懂串口通信?一文带你读懂
  5. 解决Maven的jar包冲突问题
  6. jquery原型方法map的使用和源码分析
  7. jenkins2 pipeline实例
  8. 关于js中window.location.href、location.href、parent.location.href、top.location.href的用法...
  9. ActionScript3文本框字体调整一法
  10. 华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?
  11. JavaScript开发心得--如何传递某行数据给下一页
  12. Win10 配置 Python 环境变量
  13. MySQL定时备份数据库(全库备份)
  14. iOS App 签名的原理 App 重签名(二)
  15. 数据库系统概念 第二章 习题答案
  16. 预计招收300人,北京大学信息工程学院2022年夏令营开启报名
  17. Laravel——微信授权登陆
  18. java 首次适应算法_首次适应算法java代码
  19. 数据字典chm制作教程
  20. 【Python面向对象编程】第19篇 只读属性

热门文章

  1. SCADA数据采集HAAS系统通讯测试实操步骤整理
  2. [NIPS 2018] Stacked Semantics-Guided Attention Model for Fine-Grained Zero-Shot Learning
  3. 如何面试大厂web前端?(沟通软技能总结)
  4. 网络流量监控(局域网)
  5. 自然辩证法概论-雨课堂
  6. 影片:天空上尉与明日世界
  7. 51单片机最小系统的c语言,89c51单片机最小系统,89c51最小系统原理图的功能详解...
  8. altium designer绘制51单片机最小系统
  9. csgo显示连接任何官方服务器失败,csgo连接任意官方服务器失败怎么办_csgo连接官方服务器失败解决方法...
  10. JS+html--实现图片轮播