2016-06-23 3 views
2

私は既にRecyclerViewのためにendlessScrollListenerを作成しました。私のonLoadMoreメソッドの中で、私はページの一番下にあるたびに新しいAPI呼び出しを行っています。 新しくデータを取得するために、私のapiCallメソッドに新しいapi呼び出しの新しいパラメータを与える必要があります。私は1ページ目でAPI呼び出しを開始し、30はアイテム数をカウントします。次の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。あなたが望むものは、私がbottomに行くとき、私のrecyclerlerviewトリガーloadmoreメソッドです。毎回 ! –

答えて

0

次にフェッチするページを知るには、最後のページ番号が必要です。 onLoadMoreに渡されるページ番号が最後のページ番号であると仮定すると、onLoadMoreが呼び出されたときに1だけインクリメントされ、次のページがフェッチされます。 また、ページリクエストが進行中であるかどうかを確認する必要があります。あなたが進行中の場合は、別の要求を開始すべきではありません。このようなもの

そして、一度api要求が行われると、requestInProgressをfalseに設定します。また、すべてのページがフェッチされたかどうかを示すフラグを保持し、要求を行うかどうかを決定するために使用することもできます。

0

あなたはnotifyDataSetChanged()を追加できます。あなたは成功のメソッドを呼び出します。あなたがENDOFであるので、これはAPIを複数回呼び出しますので、コードスニペットの下

は、ビューが終わり

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呼び出しを行うためのロジックを作る作るたときに検出することができるようになりますリスト...グローバル変数を作成し、onScrollメソッドで設定し、onSuccess()でリセットすると、複数のAPI呼び出しを防ぐことができます。

あなたのページ番号を追跡する場合の方法の一つは、onSucess方法 であなたの最後のページのキーを保存し、あなたのonScroll方法でそれを読むために sharedprefrencesを使用して、1と 呼び出しによってそれをインクリメントすることですAPI。

これははい私は、スクロールリスナーを使用しています、単にあなたがこのガイドload-more-recyclerview-bottom-progressbarに従うことができますあなたのコメントについて

0

を役に立てば幸い:

すべての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(); 
} 
関連する問題