2016-03-12 58 views
7

我在JSON約32條記錄,我使用RecyclerView向他們展示,我已經實現了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現在查看我發佈了更多的代碼 – Oreo

+0

我已經添加了一個答案看看,看看它是否可以解決您的問題。如果它不讓我知道,我會進一步調查。 –

回答

5

的實現似乎是正確的,但對於一個條件它失敗,嘗試當dy> 0像這樣(也是p在活動的OnCreate)UT斯達康這樣的:

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

您使用此

if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

這意味着,一旦你已經看到22個記錄你再次加載。在再次加載時,您將獲得相同的數據並將其附加到列表中。

我可以看到您正在使用RXjava。當您在loadPost中訂閱時,請檢查您的可觀察數據正在發射的數據。我認爲它再次發出相同的數據,即你的32條記錄和這些記錄再次被添加,這是一個無限循環。

+0

所以我必須在我的代碼中進行更改? – Oreo

+0

如果你不使用分頁,你可以刪除onscroll監聽器塊。如果你使用的是pagenation,那麼你的問題是你的mApi.getPosts()塊。如果你的服務器已經使用了pagenation,那麼你將不得不在你的請求中發送頁碼。 –

+0

現在刪除onscroll監聽器。一旦執行分頁,您可以回到此處。 –

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();