Android 安卓系统-翻版分页
通过改造,在分页的REST响应中加载“更多”数据的最佳方式是什么 背景 我正在从AsyncTasks+加载程序迁移到改型。与此相关文档中OP的情况不同,我希望仅在请求时更新获取数据,而不是一次下载所有项目。目前,当用户通过调用Android 安卓系统-翻版分页,android,pagination,retrofit,Android,Pagination,Retrofit,通过改造,在分页的REST响应中加载“更多”数据的最佳方式是什么 背景 我正在从AsyncTasks+加载程序迁移到改型。与此相关文档中OP的情况不同,我希望仅在请求时更新获取数据,而不是一次下载所有项目。目前,当用户通过调用LoaderManager.restartLoader()滚动到当前列表视图页面的末尾时,很容易做到这一点 我们的客户使用的API的示例响应: { "data": [ { "nid": 4382, "comment_text": "som
LoaderManager.restartLoader()
滚动到当前列表视图页面的末尾时,很容易做到这一点
我们的客户使用的API的示例响应:
{
"data": [
{
"nid": 4382,
"comment_text": "some user comment", ...
}, ...
],
"paging": {
"nextPage": "http://api.domain.net/v2/comments?page=1&pageSize=20&requestLandmark=M4ewMnwxDUsdadf0NTIwfDU2OA==%3D%3D",
"itemsTotal": 5164,
"page": 0,
"pagerMax": 218,
"requestLandmark": "M4ewMnwxDUsdadf0NTIwfDU2OA=="
}
}
我知道我们可以向我们的APIService提供如下“页面”参数:
public interface APIService {
@GET("/comments/{page}") //
List<Comment> getComments(@Path("page") int page);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
...
mLoadHandler.handleNewItemLoading(firstVisibleItem, visibleItemCount, totalItemCount);
...
}
而mLoaderHandler是一个例子:
/**
* Handles new content loading for ListView if the list has been scrolled to the end
*/
public class ListLoadMoreHandler {
private static final int MAX_PAGES_TO_LOAD = 10;
private boolean mLoadingContent;
private int mPageIndex = 0;
private int mTotalItemCount;
private final LoaderManager mLoaderManager;
private final int mLoaderId;
private final LoaderManager.LoaderCallbacks<?> mCallBack;
public ListLoadMoreHandler(LoaderManager loaderManager,
int loaderId,
LoaderManager.LoaderCallbacks<?> callback) {
mLoaderManager = loaderManager;
mLoaderId = loaderId;
mCallBack = callback;
}
/**
* Trigger loading of new items when end of list view is reached
* @param firstVisibleItem first visible item in list view
* @param visibleItemCount visible items in list view
* @param totalItemCount total items in list view
*/
public void handleNewItemLoading(int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (totalItemCount == 0 || totalItemCount < RestClient.DEFAULT_PAGINATION_SIZE) {
return;
}
int visibleTrigger = 2;
if (mPageIndex < MAX_PAGES_TO_LOAD && !mLoadingContent &&
(totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleTrigger)) {
Log.d(TAG, "restarting loader");
mLoadingContent = true;
mPageIndex++;
mLoaderManager.restartLoader(mLoaderId, null, mCallBack);
}
}
...
}
/**
*如果列表已滚动到末尾,则处理ListView的新内容加载
*/
公共类ListLoadMoreHandler{
私有静态最终int MAX_PAGES_TO_LOAD=10;
私有布尔mLoadingContent;
私有int mPageIndex=0;
私有整数mTotalItemCount;
专用最终装载机管理器mLoaderManager;
私有最终整数mLoaderId;
专用最终LoaderManager.LoaderCallbacks McCallback;
公共列表LoadMoreHandler(LoaderManager LoaderManager,
int loaderId,
LoaderManager.LoaderCallbacks(回调){
mLoaderManager=loaderManager;
mLoaderId=loaderId;
mCallBack=回调;
}
/**
*到达列表末尾视图时触发加载新项
*@param firstVisibleItem列表视图中的第一个可见项
*@param visibleItemCount列表视图中的可见项
*@param totalItemCount列表视图中的项目总数
*/
public void handleNewItemLoading(int firstVisibleItem、int visibleItemCount、int totalItemCount){
if(totalItemCount==0 | | totalItemCount (totalItemCount-VisibleTItemCount)改型2引入了一种很好的处理分页的方法。它目前处于测试阶段,但相当稳定。可能值得一看!请参阅本演讲中的16:34及以后的内容:这看起来像是泛型的工作。我将有一个数据类型容器,其中包含列表数据和分页信息,然后定义getComments
返回容器
(因为您的服务不会按原样返回列表
,除非您添加自定义Gson反序列化器)好主意,@stkent和njzk2。我将合并这两个建议并在此处发布我的解决方案