recyclerview分页加载(recyclerview实现翻页)

http://www.itjxue.com  2023-02-24 09:43  来源:未知  点击次数: 

recyclerview怎么实现分页加载

也是仅供初学的朋友们参考下,希望大家见谅。

Recyclerview是 Listview 的升级版本,在项目中使用较为广泛,官方也推荐我们使用 Recyclerview 来代替 Listview,在此就不多说 Recyclerview 的优势特点 balala了。。。

在实际项目中,列表通常是分页的,请求服务器也只会一次请求若干条,按需加载,这样比较节省流量,这样就有了我们很常见的下拉加载更多的功能,具体的实现效果如下图:

Android 分页加载(paging)断网重连,重新加载的解决方案

最近在使用Android官方提供的paging组件进行分页功能的时候,遇到了一个问题。首先,paging每次显示一页的数据,下滑到一定程度以后发送第二次取数据的api,以此达到分页的效果。

当我们第一次显示成功以后,断开网络,然后划到底部。这个时候,发送API失败了。重新链接以后,再往下滑动,也不会有任何反应。这显然跟我们实际体验是有区别的。下面说一下具体的方法。

具体例子可以参考谷歌github上 例子

这里贴一个关于描述paging使用的文章,我觉得非常好,可以看一下,我这里不详细说了。

主要分三个部分

DataSource

PageList

PageListAdapter

其中,DataSource是负责处理分页。

核心是 三个方法

paging在向下滑动的过程中,到达指定的位置以后,会执行loadAfter,来获取下一页的数据。但是这个处理只会执行一次,这就是为什么断网以后,重连以后,再滑动也不会有反应了。

通过上面的分析的原因,我们知道了原因是获取下一页的数据只会执行一次,那么我们对应的方法也就很好理解了,我们在需要的时候,再执行一次loadAfter就可以达到我们需要的效果了。

我这边,是在recyclerview滑动到最底部的时候,重新执行loadAfter

DataSource

重新执行的方法

核心部分在retry。当我们发送API失败以后,retry保存当前失败的API处理操作。我们在需要的时候,去调用 retryAllFailed() 方法,重新执行这次的API

顺便一说,这里用到的是携程发送API,如果在retry的过程中,不用 GlobalScope.launch 的话,可能会阻塞主线程,导致卡顿。

recyclerview 分页加载

```

mRecycle_alarm.setOnScrollListener(new RecyclerView.OnScrollListener() {

@Override

? ? public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {

super.onScrollStateChanged(recyclerView, newState);

? ? ? ? isLoad =true;

? ? ? ? int lastPosition = -1;

? ? ? ? if(newState == RecyclerView.SCROLL_STATE_IDLE) {

RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();

? ? ? ? ? ? if(layoutManagerinstanceof GridLayoutManager){

lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();

? ? ? ? ? ? }else if(layoutManagerinstanceof LinearLayoutManager){

lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();

? ? ? ? ? ? }

if(lastPosition = recyclerView.getLayoutManager().getItemCount() -1){

int bottomMsgId =mAlarmMessageBaselist.get(mAlarmMessageBaselist.size()-1).getRows().get(mAlarmMessageBaselist.get(mAlarmMessageBaselist.size()-1).getRows().size()-1).getMsgId();

? ? ? ? ? ? ? ? if (hasMore){

setData(bottomMsgId);

? ? ? ? ? ? ? ? }else {

isLoad =false;

? ? ? ? ? ? ? ? }

}

}

}

@Override

? ? public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {

super.onScrolled(recyclerView, dx, dy);

? ? }

});

```

```

```

(责任编辑:IT教学网)

更多

相关Photoshop教程文章