我已经为endlessScrollListener
创建了RecyclerView
。在我的onLoadMore
方法中,我每次都在页面底部进行新的api通话。
我需要为新的api调用提供apiCall
方法的新参数以获取新数据。我开始api调用第1页和30 - 用于项目计数。下一个api调用应该有2,30,接下来3,30等等。
我想做循环。但是,有人可以提出更好的方式吗?
public void makeApiCall(int pageNumber, int pageSize) {
ApiCall.ApiCallRx apiCall = ApiCall.createRx();
Observable<Response<ApiObject>> observable =
apiCall.apiItems(ApiKey.apiKey, pageNumber, pageSize);
observable.observeOn(AndroidSchedulers.mainThread()).
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Subscriber<Response<ApiObject>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.d("MainActivity", "Call Failed"+ e.getMessage());
}
@Override
public void onNext(Response<ApiObject> apiResponse) {
callSuccess(apiResponse);
Log.d("MainActivity", "Call Success");
}
});
}
private void callSuccess(Response<ApiObject> apiResponse) {
apiItems = apiResponse.body().getProducts();
objectAdapter = new ObjectAdapter(apiItems);
recyclerView.setAdapter(objectAdapter);
}
private void setScrollListener(){
recyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount) {
makeApiCall(2,30);
}
});
}
答案 0 :(得分:0)
您只需要您的最后一个页码即可知道接下来要访问的页面。 假设传递给onLoadMore的页码是最后一个页码,当调用onLoadMore时,只需将其递增1并获取下一页。 如果页面请求正在进行,您还应该维护。如果请求正在进行,则不应发起另一个请求。像这样的东西
if (!requestInProgress){
pageNumber += 1;
requestInProgress = true;
makeApiCall(pageNumber)
}
一旦api请求完成,您将requestInProgress设置为false。您还可以维护一个标志,以指示是否已提取所有页面,并使用它来决定是否发出请求。
答案 1 :(得分:0)
您可以添加notifyDataSetChanged();在你打电话给成功方法。
下面的代码段将允许您检测视图何时到达结束
recyclerView.setOnScrollListener(new OnScrollListener(){
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if(firstVisibleItem + visibleItemCount >= totalItemCount){
// End has been reached
}
}
并确保你创建一个api调用的逻辑,因为这将调用api多次,因为你在列表的末尾。创建一个全局变量并在onScroll方法中设置它并在onSuccess()中重置它所以你可以防止多个API呼叫。
如果您想跟踪您的页码,可以使用其中一种方式 sharedprefrences将最后一页的密钥存储在onSucess方法中 并在你的onScroll方法中读取它,然后将其递增1和 打电话给api。
希望这有帮助
答案 2 :(得分:0)
对于您的评论是,我正在使用滚动监听器,您只需按照本指南load-more-recyclerview-bottom-progressbar:
首先,您的RecyclerView.Adapter
必须如下:
public class MyAdapter extends RecyclerView.Adapter{
ArrayList<YourModel> models;
RecyclerView mRecyclerView;
private OnLoadMoreListener mOnLoadMoreListener;
private boolean isLoading;
private int visibleThreshold = 5;
private int lastVisibleItem, totalItemCount;
public void setLoaded() {
isLoading = false;
}
public void setOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) {
this.mOnLoadMoreListener = mOnLoadMoreListener;
}
public MyAdapter(ArrayList<YourModel> models,RecyclerView recyclerview){
this.models=models;
this.mRecyclerView=recyclerview;
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
if (mOnLoadMoreListener != null) {
mOnLoadMoreListener.onLoadMore();
}
isLoading = true;
}
}
});
}
}
然后创建OnLoadMoreListener
类:
public interface OnLoadMoreListener {
void onLoadMore();
}
然后在Activity
声明并将onScrollListener
添加到您的适配器:
MyAdapter myAdapter=new MyAdapter(models,recyclerview);
myAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore() {
if(getNEXT_PAGE()!=0) {
if (!mIsRefreshing) {
//you can add null object for progress view
//if you dont want you can disable this
needYouUsers.add(null);
needYouAdapter.notifyItemInserted(needYouUsers.size() - 1);
mSwipeRefreshLayout.setEnabled(false);
makeYourRequest();
}
}
}
});
然后,您必须在方法中使用setLoaded
适配器:
public void makeYourRequest(){
//do your all stuff make request etc..
//finally
myadapter.setLoaded();
}