2016-03-12 35 views
7

mam około 32 rekordów w json używam RecyclerView im pokazać i wdrożyliśmy OnScrollListener (...)RecyclerView OnScrollListener() Problem

Pytanie

zacząłem działalność, I pobrane wszystko 32 rekordy, teraz kiedy ja przewijać, dlaczego mam znowu 32 rekordy ponownie i zaczyna sam raz, kiedy ja przewijać, tu jest moja realizacja 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

Co mPostPresenter.loadPosts (fałsz) zrobić? czy ponownie załaduje json? –

+0

@RageshRamesh sprawdź teraz Wysłałem więcej kodu – Oreo

+0

Dodałem odpowiedź, zobacz i zobacz, czy rozwiązuje twój problem. jeśli to nie dadzą mi znać, a ja zbadam dalej. –

Odpowiedz

5

wdrożenie wydaje się być poprawne, ale dla jednego warunek, że się nie powiedzie, spróbuj, gdy dy> 0 like this (również p ut to w onCreate Aktywności):

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

dziękuję :) Twoje rozwiązanie zadziałało, ale nie rozumiem, co oznacza dy i dx? – Oreo

+1

dx - Ilość przewijania poziomego. dy - Ilość pionowego przewijania. –

+0

@VeereshCharantimath - Hi. Potrzebuję tego samego dla horyzontalnego widoku recyklingu. Chcesz zadzwonić do serwisu WWW na ostatni element widoczny. Ale nie jestem w stanie tego zrobić. Czy możesz mnie poprowadzić, proszę. –

0

Używasz tego

if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

Czyli po obejrzeniu 22 rekordy, które są ponownie ładowanie. Podczas ładowania ponownie otrzymujesz te same dane i dodajesz je do swojej listy.

widzę, że używasz RXjava. Kiedy subskrybujesz w loadPost, sprawdź, jakie dane emituje Twój obserwowalny. Wydaje mi się, że ponownie emituje te same dane, np. twoje 32 rekordy i te rekordy są dodawane ponownie, a to jest nieskończona pętla.

+0

, więc gdzie muszę dokonać zmiany w moim kodzie? – Oreo

+0

Jeśli nie korzystasz z tej opcji, możesz po prostu usunąć blok mechanizmu nasłuchującego. Jeśli korzystasz z metod upamiętniania, problem dotyczy bloku mApi.getPosts(). Jeśli twój serwer użył enkodowania, będziesz musiał wysłać numer strony w swojej prośbie. –

+0

usuń Onscroll Listener na teraz. Po zaimplementowaniu stronicowania możesz do tego wrócić. –

0

Oto kolejny sposób, aby wywołać coś, gdy ostatnia pozycja zostanie osiągnięta

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