2016-03-12 10 views
7

(...)私は、私はRecyclerViewはそれらを表示するために使用していますJSONで約32レコードを持っていると私はOnScrollListenerを実装している私が活動を開始したRecyclerView OnScrollListenerは()を発行

質問、私はすべてのフェッチ32件の記録、今私がスクロールしないとき、私はここで、スクロールを行う時はいつでも、なぜ私は再び、何度も何度も同じ32件のレコードを取得していますがOnScrollListener(の私の実装である)

public void initializeOnScrollForRecyclerView() { 
     mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

       int visibleItemCount = recyclerView.getLayoutManager().getChildCount(); 
       int totalItemCount = recyclerView.getLayoutManager().getItemCount(); 
       int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); 

       if (!isLoading) { 
        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
         isLoading = true; 
         mPostPresenter.loadPosts(false); 
        } 
       } 
      } 
     }); 
    } 
+0

に達したときにmPostPresenter.loadPosts(偽)とは何をするのか、何かをトリガーする別の方法ですか?それは再びjsonをロードしますか? –

+0

@RageshRamesh check now私はさらにコードを投稿しました – Oreo

+0

私は答えを追加して見て、それがあなたの問題を解決するかどうかを確認します。それが私に知らせていないと私はさらに調査します。 –

答えて

5

は、実装は正しいように思えるが、1つのためにそれが失敗する条件、dy> 0のようなときに試してみてください(また、p活動のOnCreate関数)でこれをユタ:あなたは、あなたが再びロードしている22回の記録を見たら意味はどの本

if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

を使用している

private boolean loading = true; 

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
     } 


     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
     { 

      if (loading) { 
       if (dy > 0) //check for scroll down 
       { 
        visibleItemCount = layoutManager.getChildCount(); 
        totalItemCount = layoutManager.getItemCount(); 
        pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); 

        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
         loading = false; 

         Log.v("...", " Reached Last Item"); 
         loadMoreVideos(searchVideos); 
        } 

       } 
      } 
     } 
    }); 
+0

ありがとう:)あなたのソリューションは私のために働いたが、私はdyとdxが何を意味するのか分からなかった。 – Oreo

+1

dx - 水平スクロールの量です。 dy - 垂直スクロールの量です。 –

+0

@VeereshCharantimath - こんにちは。私は水平なリサイクルのために同じことが必要です。最後の項目が表示されているときにWebサービスを呼びたい。しかし、私はそれをすることができません。私を助けてください。 –

0

。また、読み込み中に同じデータを取得してリストに追加しています。

私はあなたがRXjavaを使用しているのを見ることができます。 loadPostを購読しているときに、あなたの観測対象がどのデータを放出しているかをチェックします。私は同じデータを再び放出すると思います。つまり、あなたの32レコードとそれらのレコードは再び追加され、これは無限ループです。

+0

私はどこでコードを変更する必要がありますか? – Oreo

+0

ページングを使用していない場合は、オンスクロールリスナーブロックを削除するだけで済みます。 pagenationを使用している場合は、mApi.getPosts()ブロックに問題があります。サーバーがpagenationを使用している場合は、要求にページ番号を送信する必要があります。 –

+0

今のところonscroll Listenerを削除してください。ページ分割が実装されると、これに戻ってくることができます。 –

0

ここで最後の項目が

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

    //When last item is reached 
    if(position == yourList.size() - 1){ 
     loadMoreMessages(); 
    } 
    } 

public abstract void loadMoreMessages(); 
関連する問題