2016-06-23 18 views
2

我已經爲我的RecyclerView創建了endlessScrollListener。在我的onLoadMore方法中,每當我處於頁面底部時,我都會進行一次新的api調用。 我需要給我的apiCall方法一個新的參數,以獲得新的數據。我開始與第1頁和第30頁的api電話聯繫,以便進行項目統計。接下來的API調用應該有2,30,接下來的3,30等等。 我正在考慮做循環。但任何人都可以提出一個更好的方法?RecyclerView的無盡滾動,並使新的API呼叫顯示新的數據

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

我使用'RecyclerView'喜歡你。它的工作很好。你有這種問題嗎? –

+0

回收站視圖沒有問題。但滾動監聽器不能按我想要的方式工作。 – MikeB

+0

okey。你想要什麼,我的回收查看觸發器加載更多的方法,當我要到底。每次 ! –

回答

0

您只需要最後一個頁碼就可以知道下一頁要抓取哪個頁面。 假設傳遞給onLoadMore的頁碼是最後一個頁碼,當調用onLoadMore時,只需將它加1並獲取下一頁。 如果頁面請求正在進行,您還應該維護。如果請求正在進行,則不應再發起另一個請求。像這樣的東西

if (!requestInProgress){ 
    pageNumber += 1; 
    requestInProgress = true; 
    makeApiCall(pageNumber) 
} 

一旦api請求完成,您將requestInProgress設置爲false。您還可以維護一個標誌來指示是否所有頁面都已被提取,並用它來決定是否提出請求。

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 
    } 
} 

,並sureyou做出邏輯,使API調用一次,因爲這將調用API多次,因爲你是在endof list ..創建一個全局變量,並將其設置爲onScroll方法,並將其重置爲onSuccess(),這樣可以防止多個API調用。

如果你想跟蹤您的頁碼的方法之一是使用 sharedprefrences存儲在onSucess方法 你最後的翻頁鍵,並在您onScroll方法來讀取它,然後由1次 調用加一API。

希望這有助於

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(); 
} 
相關問題