RecyclerView的无尽滚动和新的api调用以显示新数据

时间:2016-06-23 23:48:39

标签: java android android-recyclerview lazy-loading retrofit

我已经为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);

        }
    });
}

3 个答案:

答案 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();
}