我实现了this以使用我的回收站视图进行inifinte滚动。 我这样设置:
mRecyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(glm) {
@Override
public void onLoadMore(int page, int totalItemsCount) {
anotherOne(page, mScope, mCurrentSortPreference, false);
Log.v(LOG_TAG, "onloadmore called");
}
});
方法anotherOne()
从具有异步任务的API加载回收器视图中的数据。
如果我从API中获取了20多个项目(在初始调用中),它可以正常工作。这是因为我的网格允许同时在屏幕上显示最多20个结果。
但是如果api返回的项目很少(比如2或3)而不是只显示那些项目,那么onLoadMore()
会被重复调用,直到它用相同的2或3项填充屏幕。然后就停止了。
这是我在EndlessRecyclerViewScrollListener.java中修改的唯一一行:
private int visibleThreshold = 1;
谢谢。
E:添加了代码
private void anotherOne(int currPage, int scope, String sort, boolean o){
String override = Boolean.valueOf(o).toString();
(new FetchMoviesTask()).execute(Integer.valueOf(currPage).toString(),
Integer.valueOf(scope).toString(), sort, override, "");
}
答案 0 :(得分:1)
来自源文档:
//低于当前滚动位置的最小项目数
//在加载更多之前。
private int visibleThreshold = 5;
这意味着它必须至少有visibleThreshold
个未显示的内容,以便安全无法收集更多数据......所以您要求:
private int visibleThreshold = 1;
这意味着您的数据集必须具有"全屏加上visibleThreshold",因为您没有更多数据,它假设您这样做,请求错误的偏移,并重复获取最后一个数据,直到您拥有"全屏加上visibleThreshold"数据单位。
降低Treshold
,或在false
上返回onLoadMore
@Override
public boolean onLoadMore(int page, int totalItemsCount) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to your AdapterView
loadNextDataFromApi(totalItemsCount);
return true; // ONLY if more data is actually being loaded; false otherwise.
}
public void loadNextDataFromApi(int offset) {
// Send an API request to retrieve appropriate paginated data
// --> Send the request including an offset value (i.e `page`) as a query parameter.
// --> Deserialize and construct new model objects from the API response
// --> Append the new data objects to the existing set of items inside the array of items
// --> Notify the adapter of the new items made with `notifyDataSetChanged()`
}
答案 1 :(得分:1)
在我的情况下,我忘记添加行。希望它对某人有帮助。 recyclerView.addOnScrollListener(scrollListener);
答案 2 :(得分:0)
如果在EndlessRecyclerViewScrollListener的onScrolled()方法中设置断点,您将知道原因。如果屏幕上没有足够的项目,则recyclerView将自动滚动并调用onScrolled方法。由于没有足够的项目来占据屏幕,因此lastVisibleItemPosition +阈值将始终大于totalNumberOfItems。结果,将重复调用onLoadMore方法。